我正在使用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中杀死进程有不同的方法吗?一些第三方模块,或许?
非常感谢。
答案 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位版本分发您的应用程序。