使用Python中的子进程从进程中无缓冲读取

时间:2009-07-26 03:21:36

标签: python subprocess

我试图从一个产生长而耗时的输出的过程中读取。但是,我希望捕获它的输出,并在生成它时。但是使用类似下面的东西似乎是在缓冲命令的输出,所以我最终得到了输出行:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
    for line in p.stdout:
        print line

我在MacOS 10.5上尝试这个

3 个答案:

答案 0 :(得分:29)

文件迭代器正在进行一些内部缓冲on its own。试试这个:

line = p.stdout.readline()
while line:
    print line
    line = p.stdout.readline()

答案 1 :(得分:6)

通常情况下,每个节目都会在输入和/或输出频道上进行比你想要的更多的缓冲...除非它被愚弄相信所说的频道实际上是一个终端!

对于那个“为了一个好的事业而愚弄”的目的,使用pexpect - 它在Mac上运行得很好(在Windows上生活更难,尽管有一些解决方案甚至可能有帮助 - 幸运的是我们不会当你使用Mac时,需要纠缠于那些。)

答案 2 :(得分:3)

这实际上是Python 2.6中修复的错误:http://bugs.python.org/issue3907