在Python中使用子进程从进程进行无缓冲读取
我试图从一个产生长而耗时的输出的过程中读取数据。然而,我想在它被生产时捕捉它的输出。但是使用类似于以下的东西似乎是在缓冲命令的输出,因此我最终一次获得了所有的输出行:在Python中使用子进程从进程进行无缓冲读取,python,subprocess,Python,Subprocess,我试图从一个产生长而耗时的输出的过程中读取数据。然而,我想在它被生产时捕捉它的输出。但是使用类似于以下的东西似乎是在缓冲命令的输出,因此我最终一次获得了所有的输出行: p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0) for line in p.stdout: print line 我正在MacOS 10.5上尝试这一点,文件迭代器正在进行一些内部缓冲。试试这个: line
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
print line
我正在MacOS 10.5上尝试这一点,文件迭代器正在进行一些内部缓冲。试试这个:
line = p.stdout.readline()
while line:
print line
line = p.stdout.readline()
您还需要确保正在运行的进程实际上经常刷新其输出缓冲区。通常,每个程序在其输入和/或输出通道上执行的缓冲比您希望的要多。。。除非它被愚弄到相信说的频道实际上是一个终端
为了达到“愚弄他人”的目的,请使用——它在Mac电脑上运行得很好(在Windows上的生活更艰难,尽管有一些解决方案可能会有所帮助——幸运的是,当您使用Mac电脑时,我们不需要详细讨论这些解决方案)。这实际上是一个在Python 2.6中修复的错误:复制:,在Python2.7上,p.stdout中的行的
仍然延迟其输出,而iter(p.stdout.readline,b'')中的行的按预期工作(它会在行可用时立即生成行)。抱歉,2.x默认情况下不会使用新的io库,正如错误报告的最后一条评论所说;对于io.open(p.stdin.fileno())中的line,您必须执行类似于的操作。
@Ari:对于io.open(p.stdout.fileno())中的line,这应该是吗?
?谢谢,您为我节省了一些麻烦。您还需要确保正在运行的进程实际上经常刷新其输出缓冲区。我调试了半天,发现stdout在被导入管道时有相当大的缓冲区。因此,我不得不在程序的代码中添加一些刷新,以使输出实际出现。