Python мониторинг stderr и stdout подпроцесса - PullRequest
10 голосов
/ 03 марта 2011

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

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

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

Я запустил его и запустил как поток, но, насколько я могу судить, мне все равно нужно в конечном итоге вызвать подпроцесс. Открыть, чтобы запустить программу и запустить в той же стене.

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

1 Ответ

13 голосов
/ 03 марта 2011

Я сделал то же самое с 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 на самом деле не нужно.

...