python,迭代subprocess.Popen()stdout / stderr

时间:2012-07-30 20:15:05

标签: python subprocess

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

在Gnu / Linux上,使用Pythonsubprocess模块,我使用以下代码迭代 使用子进程启动的命令的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'],在这种情况下输出不会被刷新,而是只在命令完成。

有解决方案吗?

1 个答案:

答案 0 :(得分:2)

查看How to flush output of Python print?

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

  

-u强制stdin,stdout和stderr完全无缓冲。在系统上                 tems在哪里重要,也把stdin,stdout和stderr放在二进制文件中                 模式。请注意,xreadlines()中有内部缓冲,                 readlines()和文件对象迭代器(“用于sys.stdin中的行”)                 这不受此选项的影响。为了解决这个问题,你                 将要在“while 1:”循环中使用“sys.stdin.readline()”。

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

import sys
sys.stdout.flush()