2013-03-10 4 views
5

Я хотел бы прочитать то, что написано в stderr подпроцессом во время его выполнения.Чтение stderr подпроцесса во время его выполнения

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

#!/usr/bin/env python2 

import sys 
from subprocess import Popen, PIPE, STDOUT 

if len(sys.argv) < 2: 
    print "Please provide a command" 
    sys.exit(1) 

sub = Popen(sys.argv[1:], stdout=PIPE, stderr=STDOUT) 

for i, line in enumerate(sub.stdout): 
    sys.stdout.write("%d: %s" % (i, line)) 

редактировать:

Хорошо, я стал ближе. Если я укажу количество прочитанных байтов, это приведет к удалению буферизации.

#!/usr/bin/env python2 

import sys 
from subprocess import Popen, PIPE, STDOUT 

if len(sys.argv) < 2: 
    print "Please provide a command" 
    sys.exit(1) 

sub = Popen(sys.argv[1:], stdout=PIPE, stderr=STDOUT) 

i = 0 
while sub.poll() is None: 
    line = sub.stdout.read(64) 
    line.strip("\b") 
    sys.stdout.write("%d: %s\n" % (i, line)) 
    i += 1 

Отрывок выхода:

58: 86 q=21.0 size= 4541841kB time=00:00:22.08 bitrate=1685014.2kbi 
frame= 567 fps= 86 q=22.0 size= 4543667kB time=00:00:2 
frame= 621 fps= 87 q=20.0 sizs/s  
frame= 4545352kB time=00:00:26.11 bitrate=1425939.2kbits/s  
62: = 686 fps= 90 q=12.0 size= 4546970kB time=00:00:28.89 bitrate=1 
frame= 758 fps= 93 q=25.0 size= 4548534kB t 
frame= 794 fps= 92 bitrate=1168185.5kbits/s  
65: q=27.0 size= 4550901kB time=00:00:33.40 bitrate=1115897.0kbits/ 
frame= 827 fps= 91 q=27.0 size= 4552324kB time=00:00:34.7 
frame= 857 fps= 89 q=26.0 size= 
frame= 254kB time=00:00:36.12 bitrate=1032874.9kbits/s  
69: 892 fps= 88 q=25.0 size= 4556598kB time=00:00:37.36 bitrate=9988 
frame= 948 fps= 89 q=19.0 size= 4558565kB time= 
frame= 1006 fps= 90 q=19937320.4kbits/s  
72: .0 size= 4560139kB time=00:00:42.16 bitrate=885880.0kbits/s  
73: frame= 1060 fps= 91 q=19.0 size= 4561958kB time=00:00:44.49 bitr 
frame= 1122 fps= 93 q=18.0 size= 4563460 
frame= 1173 fps=0:47.08 bitrate=793898.4kbits/s 

Похоже, моя проблема в настоящее время является то, что FFmpeg использует символы Backspace, или аналогичный замарать стандартный вывод. Не уверен, что здесь происходит.

+0

Какой процесс вы используете? Скорее всего, он буферизует его выход при подключении к трубе. –

+0

См. [Catching stdout в режиме реального времени из подпроцесса] (http://stackoverflow.com/q/1606795) –

+0

Процесс является ffmpeg, я пытаюсь прочитать fps во время преобразования – OregonTrail

ответ

3

Предлагаю использовать модуль sh. Это очень приятная часть программного обеспечения, которая обертывает подпроцессы на питоне и дает вам питоновский, красивый интерфейс, который вам понравится. Посмотрите на docs.

Если вы действительно не хотите sh модуля используйте communicate метод Popen

+0

Кто говорит, что OP использует связь? –

1

Вы должны использовать ТРУБЫ для обоих, также, вам нужно позвонить communicate():

sub = Popen(sys.argv[1:], stdout=PIPE, stderr=PIPE) 
output, error_output = sub.communicate() 

print 'OUTPUT:' 
print output 

print 'ERROR:' 
print error_output 
+0

Почему? Перенаправление 'stderr' в stdout в порядке, а не проблема. –

+0

В этом случае это не проблема. В общем, вы можете захотеть их разделить, чтобы узнать, произошла ли какая-либо ошибка. Я не упомянул о недостатке 'communication()', который необходим для исправления проблемы оригинального плаката. –

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