所以我试图将 HandBrakeCLI 的输出捕获为 Python 子进程。这对于 stderr 来说不是问题,因为每次更新都会在类似文件的管道中创建一个新行。但是,使用标准输出,HandBrakeCLI 会进行就地更新,但我很难捕获它们。我什至不确定就地更新的名称,这使得查找相关提示变得有点棘手。
到目前为止,我想出的唯一解决方案是将标准输出写入实际文件并从中读取,但我宁愿以合理的方式(在内存中)执行此操作。
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)
这可行,但必须有更好的方法。当尝试使用 communications() 或只是简单的 proc.stdout.read() 时,我什么也得不到。
我究竟做错了什么?谢谢!
Update
根据 @wim 的建议,我检查了 HandBrakeCLI 提供的原始输出,它看起来像这样:
\rEncoding: task 1 of 1, 0.15 %
处理以 \r 为前缀的标准输出的最佳方法是什么?