【问题标题】:How to terminate a process without os.kill() - OSGeo4W Python 2.5如何在没有 os.kill() 的情况下终止进程 - OSGeo4W Python 2.5
【发布时间】:2011-11-22 19:23:44
【问题描述】:

我正在使用 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,在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 中杀死进程是否有不同的方法?也许是一些第三方模块?

非常感谢。

【问题讨论】:

  • os.kill() 是一个需要两个参数的函数,而不是os 的参数。因此,您需要使用 os.kill(pid, signal) 之类的名称来调用它。
  • 糟糕!忘记了你在 Windows 上运行的情况,看来你至少需要 Python 2.7。
  • 您可以尝试:blogs.oracle.com/rajkumar/entry/how_to_kill_a_process 或 cmets 中提到的其他方法之一。由于我目前无法访问 Windows,因此我无法保证其中任何一项。
  • 嘿 GreenMatt,我的程序实际上像这样调用os.kill:`os.kill(self.modelProcess.pid(), signal.SIGKILL)`。我会检查 pre-python2.7 的方法。
  • 我的第一条评论是对您在交互模式下输入的import os os.kill 的回应,因为我误解了错误消息。祝你好运。也许愚蠢地问,但你能把 Python 升级到 2.7 吗?似乎 OSGeo4W 人员已经在测试:trac.osgeo.org/osgeo4w/wiki/RequiresPython

标签: python qt osgeo


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 不错!很有创意。谢谢 J_Zar!
猜你喜欢
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多