2011-11-22 29 views
3

我正在使用OSGeo4W安裝程序中包含的Python2.5.2的分發版。這是一個在Windows 7上運行的32位版本。儘管PyQt並未由OSGeo4W安裝程序默認安裝,但我們已將它安裝到OSGeo4W Python安裝中,並且至今一直運行良好。 PyQt4是4.8.6版,並且是針對32位版本的Python而構建的。如何在沒有os.kill()的情況下終止進程? - OSGeo4W Python 2.5

作爲基於PyQt4中的UI的一部分,我目前產生一個QtCore.QProcess()和象這樣開始:

self.modelProcess = QtCore.QProcess() 
command = './OSGeo4W/gdal_python_exec.bat' 
argslist = 'QtCore.QString(uri, json.dumps(inputDict)) 
self.modelProcess.start(command, argslist) 

其中inputDict是一個Python字典映射Python字符串爲任意值並uri是一個到要運行的所需腳本的字符串URI。

在此過程正在運行時,用戶將看到一個包含幾個Qt小部件的窗口,其中包括一個「取消」按鈕。我對「取消」按鈕下面的信號/插槽配置:

self.cancelButton = QtGui.QPushButton('Cancel') 
self.cancelButton.clicked.connect(self.closeWindow) 

然後別處:

def closeWindow(self): 
    self.modelProcess.kill() 

按照Qt documentation,這應該殺死的處理(PyQt documentation同意在這一點上)。不幸的是,這並沒有殺死QProcess。如果我有Windows任務管理器,我可以看到我的CPU使用率繼續升高,因爲QProcess快樂地處理我的程序。

我以os.kill()elsewhere on SO是子進程可以在Python 2.5被殺死,但我的Python的分佈不包括kill功能:

>>> import os 
>>> os.kill 
Traceback (most recent call last): 
    File "(stdin)", line 1, in (module) 
AttributeError: 'module' object has no attribute 'kill' 

是否有不同的方法來殺死進程蟒蛇?也許有些第三方模塊?

非常感謝。

+0

[os.kill()](http://docs.python.org/library/os.html#os.kill)是一個需要兩個參數的函數,而不是[os]的參數(http:// docs.python.org/library/os.html#module-os)。因此你需要用'os.kill(pid,signal)'來稱呼它。 – GreenMatt

+0

糟糕!在Windows上運行失蹤,看來你至少需要Python 2.7。 – GreenMatt

+0

您可以嘗試:http://blogs.oracle.com/rajkumar/entry/how_to_kill_a_process或者評論中提到的其他方法之一。我無法擔保其中任何一項,因爲我現在無法訪問Windows。 – GreenMatt

回答

2

你可以這樣做:

import os 
import subprocess 

if platform.system() == "Windows" : 
    subprocess.Popen("taskkill /F /T /PID %i" % process_pid , shell=True) 
else : 
    os.killpg(process_pid, signal.SIGKILL) 

它是跨平臺的。 還有一個叫「psutil」模塊:

https://github.com/giampaolo/psutil

,但你應該有32個或64位版本分發應用程序。

+0

不錯!非常有創意。謝謝J_Zar! – James

相關問題