如何在没有os.kill()的情况下终止进程 - OSGeo4W Python 2.5

时间:2011-11-22 19:23:44

标签: python qt osgeo

我正在使用OSGeo4W安装程序中包含的Python2.5.2的发行版。这是在Windows 7上运行的32位分发版。虽然OSGeo4W安装程序默认不安装PyQt,但我们已将其安装到OSGeo4W Python安装中,并且它一直运行至今。 PyQt4是4.8.6版本,是针对32位版本的Python构建的。

作为基于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很乐意处理我的程序。

我已阅读elsewhere on SO使用os.kill()可以在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'

在Python中杀死进程有不同的方法吗?一些第三方模块,或许?

非常感谢。

1 个答案:

答案 0 :(得分: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位版本分发您的应用程序。