Python:执行一个长脚本而不阻塞主进程

时间:2012-09-26 14:07:27

标签: python

我正在使用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'+'"' 

1 个答案:

答案 0 :(得分:2)

你应该走得很好。只需使用

p = subprocess.Popen(command)

您可以按照documentation

中的说明检查流程是否以p.poll结尾

请注意,建议使用shell=True (出于安全原因),因此除非您有充分的理由,否则请尽量不要使用它。

如文档中所述,您的command必须是列表参数。如果您构建一个长字符串,则应使用shlex.split(command)将其转换为字符串,同时保留"及其后(当然,模块中需要import shlex)。