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