3

OSGeo4Wインストーラーに含まれているPython2.5.2のディストリビューションを使用しています。これはWindows7で実行される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()

Qtのドキュメントによると、これはプロセスを強制終了するはずです(PyQtのドキュメントはこの点に同意しています)。残念ながら、これによってQProcessが強制終了されることはありません。Windowsタスクマネージャーを使用している場合、QProcessがプログラムを正常に処理しているため、CPU使用率が上昇し続けることがわかります。

私はSOの他の場所で、を使用してPython 2.5でサブプロセスを強制終了できることを読みましたが、Pythonのディストリビューションには次の関数os.kill()が含まれていません。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 に答える