我正在尝试从一个产生长时间且耗时输出的进程中读取信息。然而,我希望在其输出生成时就能捕获它。但是使用以下代码似乎会缓存命令的输出,使得我最终一次性获取所有输出行:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
print line
我正在尝试在MacOS 10.5上做这件事
我正在尝试从一个产生长时间且耗时输出的进程中读取信息。然而,我希望在其输出生成时就能捕获它。但是使用以下代码似乎会缓存命令的输出,使得我最终一次性获取所有输出行:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
print line
我正在尝试在MacOS 10.5上做这件事
The file iterator is doing some internal buffering on its own. Try this:
line = p.stdout.readline()
while line:
print line
line = p.stdout.readline()
你还需要确保运行的进程实际上经常刷新其输出缓冲区。
这实际上是一个已在Python 2.6中修复的错误:http://bugs.python.org/issue3907
for line in p.stdout
仍会延迟输出,而for line in iter(p.stdout.readline, b'')
则按预期工作(它会在可用时立即产生行)。 - jfsfor line in io.open(p.stdin.fileno())
。 - Arifor line in io.open(p.stdout.fileno())
吗? - Richard Cook