23

我正在尝试从产生长时间且耗时的输出的过程中读取。但是,我想在它产生捕捉它的输出。但是使用类似下面的东西似乎正在缓冲命令的输出,所以我最终一次得到了所有的输出行:

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

我正在 MacOS 10.5 上尝试这个

4

3 回答 3

29

文件迭代器自己做一些内部缓冲。试试这个:

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

您还需要确保您正在运行的进程实际上经常刷新其输出缓冲区。

于 2009-07-26T03:30:39.167 回答
6

通常,每个程序都会在其输入和/或输出通道上进行比您看起来想要的更多的缓冲......除非它被愚弄到相信所说的通道实际上是一个终端!

出于“出于好意”的目的,请使用pexpect - 它在 Mac 上运行良好(在 Windows 上生活更艰难,尽管有一些解决方案可能会有所帮助 - 幸运的是,我们不需要纠缠于那些您使用 Mac 代替)。

于 2009-07-26T05:08:32.090 回答
3

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

于 2012-01-30T19:26:19.477 回答