首页 文章

Python监视子进程的stderr和stdout

提问于
浏览
10

我试图从python 2.7中启动一个程序(HandBreakCLI)作为子进程或线程 . 我已经开始了,但我无法弄清楚如何监控它的stderr和stdout .

程序将其状态(完成%)和有关编码的信息分别输出到stderr和stdout . 我希望能够定期从适当的流中检索完成的% .

我已经尝试调用subprocess.Popen并将stderr和stdout设置为PIPE并使用subprocess.communicate,但它会等待,直到进程被终止或完成然后检索输出 . 对我没有好处 .

我把它作为一个线程运行起来,但据我所知,我仍然必须最终调用subprocess.Popen来执行程序并运行到同一个墙上 .

我是以正确的方式来做这件事的吗?我还有哪些其他选择或如何按照描述使其工作?

1 回答

  • 13

    我用ffmpeg做了同样的事 . 这是相关部分的精简版 . bufsize=1 表示行缓冲,可能不需要 .

    def Run(command):
        proc = subprocess.Popen(command, bufsize=1,
            stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
            universal_newlines=True)
        return proc
    
    def Trace(proc):
        while proc.poll() is None:
            line = proc.stdout.readline()
            if line:
                # Process output here
                print 'Read line', line
    
    proc = Run([ handbrakePath ] + allOptions)
    Trace(proc)
    

    Edit 1: 我注意到子进程(在这种情况下是手刹)需要在行之后刷新才能使用它(ffmpeg) .

    Edit 2: 一些快速测试表明,实际上可能并不需要 bufsize=1 .

相关问题