Этот вопрос уже имеет ответ здесь:
Я узнал, что при выполнении команд в 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 () и ожидает команды для завершения. Там какой-либо другой путь состоит в том, чтобы следовать за выводом?
connect () блокируется до тех пор, пока дочерний процесс не вернется, поэтому остальные строки в вашем цикле будут выполнены только после завершения дочернего процесса. Чтение из 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()
Это предоставит вам вывод в реальном времени. Взято из ответа Нади здесь .
.communicate ()
"Прочитать данные из stdout и stderr, пока достигнут конец файла. Подождите, пока процесс завершится. "
Вместо этого вы должны иметь возможность просто читать из child.stderr
, как из обычного файла.