在Python中启动外部程序并立即返回

时间:2012-08-23 20:18:13

标签: python qt pyqt

  

可能重复:
  how to call a program from python without waiting for it to return

我正在编写一个需要启动外部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脚本而不影响它启动的程序?

2 个答案:

答案 0 :(得分:6)

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

QProcess.startDetached('vncviewer.exe')

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

在PyQt4计划中,首选QProcess而不是subprocess。前者集成到Qt事件循环中,允许通过Qt信号与子过程进行异步通信。

答案 1 :(得分:1)

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

如果您只是创建Popen对象然后不管它,它应该异步运行。如果要查看,可以致电process.poll()process.wait()。请注意,在让脚本终止之前,您应确保已完成,否则将毫不客气地终止子进程。要让脚本退出而不删除子流程,请参阅注释中的the question linked by @aleks_misyuk