我正在使用GNU / Linux和python 2.7.3,这是我的新手。我正在尝试使用ffmpeg命令执行长时间安装的系统进程(例如Popen()),以避免阻塞主要的python进程。我不能使它工作。

我的第一个尝试是使用线程,但这有点复杂,因为图形界面无法正常工作(我想必须有更好的方法)

然后我尝试了叉子,但这就像用坦克杀死苍蝇一样。

现在,我正在尝试使用Popen,我在Internet上看到了很多有关它的用法的引用,但是我认为它运行不正确。也许我误会了这些例子。

我试过了:

##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'+'"'

最佳答案

您应该步入正轨。只需使用

p = subprocess.Popen(command)


您可以按照documentation中所述检查进程是否以p.poll结尾。

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

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

关于python - Python:执行长脚本而不会阻塞主进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12603604/

10-14 19:30
查看更多