Подтвердить что ты не робот

Вывод подпроцесса 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() и ждет завершения команды. Есть ли другой способ следить за выходом?

4b9b3361

Ответ 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, как обычный файл.