2012-01-01 66 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 

改行は、それぞれの呼び出しによって神秘的に出力されます。それはどこから来ているのですか?どうすれば対処できますか?

communicateコール(http://stackoverflow.com/questions/7985334/python-subprocess-proc-stderr-read-introduce-extra-lines)を使用していない点を除いて同様の問題があるようです。

答えて

5

問題を再現できないため、おそらくファイルに応じてffprobeに渡されます。

とにかく、stdoutはキャプチャされていないので、おそらく問題はちょうどffprobestdoutに改行文字を印刷しているということです。このことを確認するために

、交換してください:

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が捕獲され、それがstdoutないstdinを返しますので、p.communicateからの出力が正しく命名されています。

+0

ありがとうございます。 ffprobeからの標準出力をキャプチャするのはやりました。あなたは私が間違って 'stdout'を' stdin'と誤って呼んでいるのを聞いています - 私は急いでいました。私はその後、間違いを訂正しました。 – misha

関連する問題