【发布时间】:2014-07-21 11:00:06
【问题描述】:
我正在从命名管道中逐行读取,该管道以逐秒的节奏提供行。我正在尝试简单的
for line in file:
processLine(line)
但从未调用过processLine()。 (编辑:在读取了很多行之后,它最终会被调用,这需要几分钟。)使用strace 进行调查表明,该过程确实每秒都在完成一个read() 系统调用,并且正如预期的那样接收一个完整的每次都排队。
我只能猜测for line in 习惯用法会缓冲输入,并且稍后会在每个输入行中调用processLine(),可能是当缓冲区已满或输入终止时(在我的情况下它永远不会) .
我可以将此处使用的缓冲区显式设置为更小吗?
或者是否有另一种方法来调整这件事,以便每一行也以逐秒的节奏处理?
编辑:
目前我正在使用此解决方法:
for line in lineByLine(namedPipe):
…
这是lineByLine():
def lineByLine(openFile):
line = ''
while True:
char = os.read(openFile.fileno(), 1)
if not char:
if line:
yield line
break
line += char
if line.endswith('\n'):
yield line
line = ''
但是这种丑陋的解决方法当然是没有办法的。
【问题讨论】:
-
不确定,但也许“with”会有所帮助? " with file as f: for line in f: processLine(line)"
-
@Anonymous:我已经在使用那个成语了(并且有问题)。
-
@Alfe 检查python bug report。建议可以使用
readline。 -
没错。我发现了同样的建议here ;-)
标签: python file for-loop buffer