我试图从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/