2012-01-01 7 views
2

У меня есть сценарий, который вызывает ffprobe, анализирует его вывод и выводит его на консоль.Subprocess.communicate печатает новую строку для стандартного вывода

Вот урезанная версия этого без разбора кода и командной строки опций:

"""Invoke ffprobe to query a video file and parse the output""" 

def ffprobe(fname): 
    import subprocess as sub 
    import re 
    p = sub.Popen(['ffprobe', fname], stderr=sub.PIPE) 
    stdout, stderr = p.communicate() 

def main(): 
    ffprobe("foo.mp4") 
    #print options.formatstr % locals() 

if __name__ == '__main__': 
    main() 

Вы можете видеть, что только print заявление в своем коде закомментирована, поэтому программа не должна действительно выводят что угодно. Тем не менее, это то, что я получаю:

[email protected]:~/co/youtube$ python ffprobe.py foo.mp4 

[email protected]:~/co/youtube$ python ffprobe.py foo.mp4 

[email protected]:~/co/youtube$ python ffprobe.py foo.mp4 

Новая линия таинственно выводится каждым вызовом. Откуда он исходит, и как я могу с ним справиться?

Как представляется, подобный вопрос SO, за исключением того, что он не использует вызов communicate (http://stackoverflow.com/questions/7985334/python-subprocess-proc-stderr-read-introduce-extra-lines).

ответ

5

Я не могу воспроизвести проблему, так что, возможно, это зависит от файла, который вы передаете до ffprobe.

В любом случае, из того, что я вижу, stdout не снимается, поэтому, возможно, проблема в том, что ffprobe печатает новый символ линии до stdout.

Чтобы подтвердить это, пожалуйста, замените:

p = sub.Popen(['ffprobe', fname], stderr=sub.PIPE) 
stdin, stderr = p.communicate() 

с:

p = sub.Popen(['ffprobe', fname], stdout=sub.PIPE, stderr=sub.PIPE) 
stdout, stderr = p.communicate() 

В новой версии, stdout захватывается и выход из p.communicate назван правильно, так как она возвращает stdout не stdin.

+0

спасибо. Захват стандартного вывода из ffprobe сделал трюк. Вы правы во мне, неправильно называя 'stdout' как' stdin' - я был в спешке. С тех пор я исправил ошибку. – misha

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