我正在使用GNU / Linux和python 2.7.3,我是新手。我正在尝试使用ffmpeg
命令执行一个长期安装的系统进程,如Popen()
,以避免阻塞主python进程。我无法使它发挥作用。
我的第一次尝试是使用线程,但它有点复杂,因为图形界面无法正常工作(我想必须有更好的方法)
然后我尝试了叉子,但就像用坦克杀死苍蝇一样。
现在我正在尝试使用Popen
,我看到很多关于它在互联网中使用的参考资料,但我认为我没有正确运行它。也许我误解了这些例子。
我试过了:
##command is ffmpeg like that works ok
p = subprocess.Popen(command, shell=True)
我也试过了:
p = subprocess.Popen(command,stdin=PIPE, shell=True)
通常我会收到错误或后续行为,命令结束然后主程序恢复。我错过了什么?
命令部分:
global vidSource
global srtSource
global done
size = "3"
font = "/usr/share/fonts/truetype/freefont/FreeSerif.ttf"
command = 'mencoder ' + '"' + vidSource + '"' + " -oac copy -ovc lavc -lavdopts threads=2 -sub " + "'" + srtSource + "'" + " -subcp -utf8 -font "+ '"'+ font+ '"' + " -subfont-text-scale " + size + " -o " + '"' + vidSource + '2'+'"'
答案 0 :(得分:2)
你应该走得很好。只需使用
p = subprocess.Popen(command)
您可以按照documentation
中的说明检查流程是否以p.poll
结尾
请注意,建议使用shell=True
不(出于安全原因),因此除非您有充分的理由,否则请尽量不要使用它。
如文档中所述,您的command
必须是列表参数。如果您构建一个长字符串,则应使用shlex.split(command)
将其转换为字符串,同时保留"
及其后(当然,模块中需要import shlex
)。