我了解到在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()并等待命令完成后,程序不会继续。还有其他方法可以跟随输出吗?
答案 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
读取。