可能重复:
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脚本而不影响它启动的程序?
答案 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。