Вывод подпроцесса получения [дубликат]

Этот вопрос уже имеет ответ здесь:

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

25
задан schneck 26 March 2010 в 17:19
поделиться

2 ответа

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()

Это предоставит вам вывод в реальном времени. Взято из ответа Нади здесь .

27
ответ дан 28 November 2019 в 21:43
поделиться

.communicate () "Прочитать данные из stdout и stderr, пока достигнут конец файла. Подождите, пока процесс завершится. "

Вместо этого вы должны иметь возможность просто читать из child.stderr , как из обычного файла.

1
ответ дан 28 November 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: