7

有很多类似的帖子,但我没有找到答案。

Python在带有and模块的Gnu/Linux 上subprocess,我使用以下代码来迭代使用子进程启动的命令的 stdout/sdterr:

class Shell:
    """ 
    run a command and iterate over the stdout/stderr lines
    """

    def __init__(self):

        pass

    def __call__(self,args,cwd='./'):

        p = subprocess.Popen(args,
                cwd=cwd, 
                stdout = subprocess.PIPE,
                stderr = subprocess.STDOUT,
                )

        while True:

            line = p.stdout.readline()
            self.code = p.poll()

            if line == '':
                if self.code != None:
                    break
                else:
                    continue

            yield line

#example of use
args = ["./foo"]
shell = Shell()
for line in shell(args):
     #do something with line
     print line,

这工作正常...除非执行的命令是python,例如 `args = ['python','foo.py'],在这种情况下,输出不会刷新,而是仅在命令完成时打印。

有解决办法吗?

4

1 回答 1

2

查看如何刷新 Python 打印的输出?.

您需要使用 -u 选项运行 python 子进程:

-u 强制标准输入、标准输出和标准错误完全无缓冲。在重要的系统上,也将 stdin、stdout 和 stderr 置于二进制模式。请注意,xreadlines()、readlines() 和文件对象迭代器(“for line in sys.stdin”)中有内部缓冲,不受此选项的影响。要解决此问题,您需要在“while 1:”循环中使用“sys.stdin.readline()”。

或者,如果您可以控制 python 子进程脚本,则可以在每次打印时使用 sys.stdout.flush() 刷新输出。

import sys
sys.stdout.flush()
于 2012-07-30T20:21:21.840 回答