2

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

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

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

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

1 回答 1

2

你应该走在一个好的轨道上。只需使用

p = subprocess.Popen(command)

您可以检查该过程是否以 结束p.poll,如文档中所述

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

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

于 2012-09-26T14:16:24.600 回答