捕获子进程输出

时间:2010-03-26 17:19:50

标签: python subprocess

我了解到在Python中执行命令时,我应该使用子进程。 我想要实现的是通过ffmpeg编码文件并观察程序输出直到文件完成。 Ffmpeg将进度记录到stderr。

如果我尝试这样的话:

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE)
complete = False
while not complete:
    stderr = child.communicate()

    # Get progress
    print "Progress here later"
    if child.poll() is not None:
        complete = True
    time.sleep(2)

在调用child.communicate()并等待命令完成后,程序不会继续。还有其他方法可以跟随输出吗?

2 个答案:

答案 0 :(得分:26)

communication()阻塞,直到子进程返回,因此循环中的其余行只会在子进程运行完毕后执行。从stderr读取也会阻塞,除非你逐字逐句阅读:

import subprocess
import sys
child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE)
while True:
    out = child.stderr.read(1)
    if out == '' and child.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()

这将为您提供实时输出。摘自Nadia的回答here

答案 1 :(得分:1)

.communicate()“从stdout和stderr读取数据,直到达到文件结尾。等待进程终止。”

相反,您应该能够像普通文件一样从child.stderr读取。