Subprocess.communicate将换行符打印到标准输出

时间:2012-01-01 09:11:40

标签: python

我有一个调用ffprobe的脚本,解析其输出并将其输出到控制台。

这是一个精简版本,没有解析代码和命令行选项:

"""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语句已被注释掉,因此程序不应该输出任何内容。但是,这就是我得到的:

mpenkov@misha-desktop:~/co/youtube$ python ffprobe.py foo.mp4

mpenkov@misha-desktop:~/co/youtube$ python ffprobe.py foo.mp4

mpenkov@misha-desktop:~/co/youtube$ python ffprobe.py foo.mp4

每次调用都会神秘地输出换行符。它来自何处,我该如何处理?

似乎有一个类似的SO问题,除了它没有使用communicate调用(http://stackoverflow.com/questions/7985334/python-subprocess-proc-stderr-read-introduce-extra-线)。

1 个答案:

答案 0 :(得分: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