3

我正在使用 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 文档,这应该终止进程(PyQt 文档同意这一点)。不幸的是,这不会杀死 QProcess。如果我有 Windows 任务管理器,我可以看到我的 CPU 使用率随着 QProcess 愉快地处理我的程序而继续升级。

在 SO上的其他地方读到过,可以通过 using 在 Python 2.5 中杀死一个子进程os.kill(),但我的 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 中杀死进程是否有不同的方法?也许是一些第三方模块?

非常感谢。

4

1 回答 1

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 位版本分发您的应用程序。

于 2012-05-04T12:05:35.630 回答