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
может не понадобиться.