具有不就地状态更新子进程的难度捕捉输出(Having difficulty capturing ou

2019-09-22 03:07发布

所以我试图捕捉HandBrakeCLI的输出作为一个Python子进程。 这不是标准错误问题,因为每次更新会在类文件管新行。 然而,标准输出,HandBrakeCLI使得就地更新,我有困难,捕捉它们。 我还没有URE就地更新叫什么,这使得寻找相关的提示有点棘手。

我想出了迄今唯一的解决办法是将标准输出写入到实际的文件,并从阅读,但我宁愿做理智的方式(在内存中)。

COMMAND = ['HandBrakeCLI', '-v', '-i', 'in.m4v', '-o', 'out.m4v', '-Z', 'Normal']

outfile = open('output.txt', 'w')

proc = subprocess.Popen(COMMAND, stdout=outfile, stderr=subprocess.PIPE)

infile = open('output.txt', 'r')

while proc.poll() is None:
    print infile.read()
    infile.seek(0)

这工作,但必须有一个更好的办法。 当尝试使用通信()或只是简单的proc.stdout.read()我什么也没得到。

我究竟做错了什么? 谢谢!

更新

每@wim建议我检查,看看原始输出HandBrakeCLI提供什么,它看起来是这样的:

\rEncoding: task 1 of 1, 0.15 %

什么是处理前缀与\ r一个标准输出的最佳方式?

Answer 1:

我觉得我做以上关于使用universal_newlines注释=真会工作。

下面是一个示例就地作家,被称为“inplace_output.py”

import sys
import time


def main():
    for k in range(5):
        print "{0:03d}\r".format(k),
        sys.stdout.flush()
        time.sleep(1)

if __name__ == "__main__":
    main()

您可以运行,看它写000,然后001,等等,每次覆盖以前的输出。

下面是运行上述作为子进程,并通过行读取输出线的脚本:

import subprocess


cmd = ['python', 'inplace_output.py']

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)

while True:
    out = proc.stdout.readline()
    print repr(out)
    if len(out) == 0:
        break

如果想在子程序终止在一次收集所有的输出,你可以替换,比如while循环,

out, err = proc.communicate()
lines = out.splitlines()

无论是否与工作的吗?



文章来源: Having difficulty capturing output of a subprocess that does in-place status updates