Python-мониторинг stderr и stdout подпроцесса

Я пытаюсь запустить программу (HandBreakCLI) в качестве подпроцесса или потока из python 2.7. Я дошел до него, но не могу понять, как контролировать его stderr и stdout.

Программа выводит статус (% done) и информацию о кодировке в stderr и stdout, соответственно. Я хотел бы иметь возможность периодически извлекать% из соответствующего потока.

Я попытался вызвать subprocess.Popen с stderr и stdout, установленным в PIPE, и используя subprocess.communicate, но он сидит и ждет, пока процесс не будет убит или не завершится, а затем извлечет результат. Мне не очень хорошо.

У меня это работает и работает как поток, но, насколько я могу судить, мне все равно придется вызвать subprocess.Popen, чтобы выполнить программу и запустить ее в ту же стену.

Я собираюсь сделать это правильно? Какие у меня есть другие варианты или как это сделать, как описано?

Ответ 1

Я сделал то же самое с ffmpeg. Это урезанная версия соответствующих частей. bufsize=1 означает буферизацию строк и может не понадобиться.

def Run(command):
    proc = subprocess.Popen(command, bufsize=1,
        stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
        universal_newlines=True)
    return proc

def Trace(proc):
    while proc.poll() is None:
        line = proc.stdout.readline()
        if line:
            # Process output here
            print 'Read line', line

proc = Run([ handbrakePath ] + allOptions)
Trace(proc)

Изменить 1: Я заметил, что подпроцесс (ручной тормоз в этом случае) должен быть очищен после строк, чтобы использовать это (ffmpeg делает).

Редактировать 2: Некоторые быстрые тесты показывают, что bufsize=1 может не понадобиться.