2

可能重复:
如何从 python 调用程序而不等待它返回

我正在编写一个需要启动外部 Windows 可执行文件的 PyQt 程序。此时 Python 程序应该继续运行,不需要与它启动的 exe 文件有任何联系。

我尝试了几种变体,例如:

process = subprocess.Popen(["vncviewer.exe"]); process.communicate()
subprocess.call("vncviewer.exe")
os.system("vncviewer.exe")
os.system("vncviewer.exe&")
os.system("start vncviewer.exe")

等等

使用几乎任何策略,我都可以成功运行程序,但是 Python 脚本随后会被阻止,直到程序完成。GUI 被冻结且无法使用。

如何让 Python 启动一个完全独立且不相关的任务,然后继续运行,以便我可以打开其他程序,甚至结束 Python 脚本而不影响它启动的程序?

4

2 回答 2

6

PyQt4.QtCore.QProcess.startDetached()在后台独立执行程序:

QProcess.startDetached('vncviewer.exe')

与Dougal 建议的单独subprocess.Popen()对象不同,使用此方法启动的进程即使在调用进程终止后仍继续运行。

在 PyQt4 程序中,更QProcess喜欢subprocess. 前者集成到 Qt 事件循环中,并允许通过 Qt 信号与子进程进行异步通信。

于 2012-08-23T21:09:40.040 回答
1

的文档subprocess.Popen.communicate()包括“等待进程终止”这一短语,因此它被阻塞也就不足为奇了。

如果您只是创建Popen对象然后不理会它,它应该异步运行。然后你可以打电话process.poll()或者process.wait()如果你想检查一下。请注意,您应该确保在让脚本终止之前完成它,否则子进程将被毫不客气地杀死。要让脚本退出而不杀死子进程,请参阅评论中@aleks_misyuk 链接的问题

于 2012-08-23T21:01:15.150 回答