2011-03-02 5 views
10

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

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

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

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

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

+0

'общаться()' всегда ждет завершения процесса; вам нужно будет напрямую прочитать stderr. Не могли бы вы разместить какой-то код? – senderle

ответ

13

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

Edit 1: я заметил, что подпроцесс (ручной тормоз в данном случае) необходимо промывать после строки, чтобы использовать это (FFmpeg делает).

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

+0

Понижение 'bufsize' не требуется, если OP не использует значение по умолчанию, хотя настройка его на буферизацию по строке, вероятно, хорошая идея:« Значение по умолчанию для bufsize равно 0 (небуферизованное) ». http://docs.python.org/library/subprocess.html – user470379

+0

Вы правы, я просто помню, что настройка bufsize для 1 имела некоторый смысл и эффект :) Редактирование соответственно. –

+0

+1 для Edit 1: «подпроцесс должен скрываться после строк». – db42

Смежные вопросы