这些是我想在python
中使用subprocess.call执行的命令 1. ffmpeg -i filename 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"
filePath = frames/FRAME%05d.png
2. avconv -r 24 -i filePath -vf 'scale=trunc(iw/2)*2:trunc(ih/2)*2' -s 1920x1080 -c:v libx264 outPath
我还没到第二个,但这是我尝试的第一个
subprocess.call(['ffmpeg', '-i', inputV , '2','>','&1', '|', ' sed', '-n', '"s/.*, \(.*\) fp.*/\1/p"'])
并且这是错误
[NULL @ 0x915ce0] Unable to find a suitable output format for '2'
2: Invalid argument
我也不确定filePath变量赋值,因为值包含通配符
答案 0 :(得分:1)
Quickfix:添加shell=True
选项,因为您正在使用shell功能。
Longfix:编写一个正确的subprocess.Popen
命令,摆脱sed
:直接在python中执行:
import re
r = re.compile(".*, (.*) fp.*")
p=subprocess.Popen(['ffmpeg', '-i', inputV],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
while True:
l = p.readline()
if not l:
break # end of process
s = r.sub(l,r"\1")
if l!=s: # substitution worked, print it
print(s)
rc = p.wait() # get return code
因此您没有使用shell=True
,并且在python中执行sed
过滤器:您的代码不再需要sed
。
stderr=subprocess.STDOUT
负责stderr
stdout
重定向