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

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

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

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

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

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

One Solution collect form web for “Python-мониторинг stderr и stdout подпроцесса”

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

  • Где материал «печатает», когда приложение не работает с терминала?
  • Как наследовать stdin и stdout в python с помощью os.execv ()
  • Запретить подпроцесс подпроцесса писать на stdout
  • Python: как заглянуть в объект pty, чтобы избежать блокировки?
  • Пирамидальная каротаж
  • подпроцесс readline висит в ожидании EOF
  • Что означают двойные круглые скобки в вызове функции? например func (материал) (материал)?
  • Перенаправление stdout и stderr в PyQt4 QTextEdit из вторичного потока
  • Отправка строк между скриптами Python с использованием подпроцессов PIPE
  • python popen.stdout.readline () зависает
  • Прочитать консольный вывод другой программы в Python
  • Python - лучший язык программирования в мире.