我有一个调用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-线)。
答案 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
。