我试图从python 2.7中将程序(HandBreakCLI)作为子进程或线程启动。我已经尽力开始了,但是我不知道如何监视它的stderr和stdout。

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

我试过将stderr和stdout设置为PIPE并使用subprocess.communicate来调用subprocess.Popen,但是它坐着等待,直到进程被杀死或完成,然后检索输出。对我没有多大帮助。

我已经将其作为线程启动并运行,但是据我所知,我仍然必须最终调用subprocess.Popen来执行程序并运行到同一堵墙。

我要这样做正确吗?我还有什么其他选择,或者如何按照说明进行操作?

最佳答案

我已经用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)

编辑1:我注意到子进程(在这种情况下为手刹)需要在行之后刷新才能使用它(ffmpeg确实如此)。

编辑2:一些快速测试显示,实际上不一定需要bufsize=1

关于Python监视子进程的stderr和stdout,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5173945/

10-10 23:35