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

标签 python

我正在使用 GNU/Linux 和 python 2.7.3,我是新手。我正在尝试使用 Popen() 命令执行一个长时间安装的系统进程,例如 ffmpeg 以避免阻塞主 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'+'"' 

最佳答案

你应该走得很顺利。只需使用

p = subprocess.Popen(command)

您可以通过 p.poll 检查进程是否已结束,如 documentation 中所述。

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

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

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

相关文章:

python - 用三个表连接一对多?

python - 子进程.CREATE_NEW_CONSOLE

python - 计算从头到尾有障碍物的路径数

python - 访问类(class)外的 Sprite /类(class)位置

python - 在六边形网格上寻找相邻的邻居

python - 进入python解释器时打印问候语

python - jira SOAP 和 XMLRPC

python - django-allauth 社交帐户在登录时连接到现有帐户

python - 你如何在 Python 的 gRPC 库中设置超时

python - 我该怎么做才能解决参数 'Cannot parse arguments with no order' 的错误?