Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有os.kill()的情况下终止进程-OSGeo4W Python 2.5_Python_Qt_Osgeo - Fatal编程技术网

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

如何在没有os.kill()的情况下终止进程-OSGeo4W Python 2.5,python,qt,osgeo,Python,Qt,Osgeo,我正在使用OSGeo4W安装程序中包含的Python2.5.2发行版。这是在Windows 7上运行的32位发行版。虽然PyQt默认情况下不是由OSGeo4W安装程序安装的,但我们已经将其安装到OSGeo4W Python安装程序中,并且到目前为止,它一直运行良好。PyQt4是版本4.8.6,是针对32位版本的Python构建的 作为基于PyQt4的UI的一部分,我当前生成了一个QtCore.QProcess(),并按如下方式启动它: self.modelProcess = QtCore.QPr

我正在使用OSGeo4W安装程序中包含的Python2.5.2发行版。这是在Windows 7上运行的32位发行版。虽然PyQt默认情况下不是由OSGeo4W安装程序安装的,但我们已经将其安装到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()
根据,这应该会扼杀进程(在这一点上达成一致)。不幸的是,这并没有终止QProcess。如果我有Windows任务管理器,我可以看到随着QProcess愉快地处理我的程序,我的CPU使用率继续上升

我已经读到,在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中是否有不同的方法来终止进程?也许是第三方模块

非常感谢。

您可以这样做:

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”的模块:


但是您应该使用32位或64位版本分发应用程序。

是一个需要两个参数的函数,而不是参数。因此,您需要使用类似于
os.kill(pid,signal)
.Oops!您在Windows上运行的信息丢失,似乎您至少需要Python2.7。您可以尝试:或注释中提到的其他方法之一。我不能担保这些,因为我现在没有访问Windows的权限。嘿,Greenmart,我的程序实际上调用了
os.kill
如下:`os.kill(self.modelProcess.pid(),signal.SIGKILL)`。我将检查python2.7之前的方法。我的第一个评论是针对您在交互模式下输入的
导入操作系统
操作系统.kill
,因为我误解了错误消息。祝你好运。也许问得很愚蠢,但您能将Python升级到2.7吗?似乎OSGeo4W的人已经在测试:很好!很有创意。谢谢你,J_Zar!