Как завершить процесс без os.kill () - OSGeo4W Python 2.5 - PullRequest
3 голосов
/ 22 ноября 2011

Я использую дистрибутив Python2.5.2, включенный в установщик OSGeo4W.Это 32-разрядный дистрибутив, работающий в Windows 7. Хотя PyQt не устанавливается по умолчанию установщиком OSGeo4W, мы установили его для установки OSGeo4W Python и до сих пор он работал отлично.PyQt4 - это версия 4.8.6, созданная для 32-разрядной версии Python.

Как часть пользовательского интерфейса на основе PyQt4, я в настоящее время вызываю 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, я вижу, что загрузка моего ЦП продолжает расти, поскольку QProcess успешно обрабатывает мою программу.

Я прочитал в других местах SO , что подпроцесс может быть убит в Python2.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?Какой-нибудь сторонний модуль, возможно?

Большое спасибо.

1 Ответ

2 голосов
/ 04 мая 2012

Вы можете сделать это:

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-битными версиями.

...