2012-01-01 170 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输出文件名是否正确,因为它返回stdoutstdin

+0

谢谢。从ffprobe捕获标准输出的技巧。你说得对,我错误地把'stdout'称为'stdin' - 我有点急。我已经纠正了这个错误。 – misha 2012-01-01 10:29:17

相关问题