2012-08-23 57 views
1

可能重複:
how to call a program from python without waiting for it to return開始在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腳本,而不影響它啓動的程序?

+1

看到同樣的問題:如何調用從蟒蛇的程序,而無需等待其返回](http://stackoverflow.com/questions/2602052/how-to-call-a-program-from-python-無需等待換它到返回) –

回答

1

subprocess.Popen.communicate()文檔包括短語「等待進程終止,」所以這並不奇怪,它的塊。

如果你只是創建Popen對象,然後息事寧人,就應該異步運行。如果您想查看,您可以致電process.poll()process.wait()。注意你應該確保在腳本終止之前完成它,否則子進程將被毫無意義地殺死。要讓腳本退出而不終止子進程,請參閱註釋中的the question linked by @aleks_misyuk

6

PyQt4.QtCore.QProcess.startDetached()獨立執行程序在後臺:

QProcess.startDetached('vncviewer.exe') 

不像獨自subprocess.Popen()對象as suggested by Dougal,進程開始用這種方法繼續調用進程已終止即使運行。

在PyQt4的程序,更喜歡QProcess超過subprocess。前者集成到Qt事件循環中,並允許通過Qt信號與子進程進行異步通信。