28

Python で subprocess パッケージを使用してサブプロセスを実行していますが、後でこれを強制終了する必要があります。ただし、subprocess パッケージのドキュメントには、terminate() 関数は 2.6 以降でのみ使用できると記載されています。

Linux 2.5 を実行していますが、下位互換性のために 2.6 にアップグレードできません。代替手段は何ですか? これらの関数は、何かの便利なメソッドであると推測しています。

4

4 に答える 4

41

プロセス pid で os.kill を呼び出します。

os.kill(process.pid, signal.SIGKILL)

Linux を使用しているため、問題ありません。Windows ユーザーは不運です。

于 2009-06-30T15:32:06.420 に答える
40

@Gareth の回答を完成させるには、Windows では次のようにします。

import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, theprocess.pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)

ほどエレガントではありませんos.kill(theprocess.pid, 9)が、機能します;-)

于 2009-06-30T15:41:43.217 に答える
6

@Gareth と @Alex の回答を完成させるために、基になるシステムに煩わされたくない場合は、psutilを使用できます。

psutil は、実行中のプロセスとシステム使用率 (CPU、メモリ) に関する情報を Python を使用して移植可能な方法で取得するためのインターフェイスを提供するモジュールであり、ps、top、kill、Windows タスク マネージャーなどのコマンド ライン ツールによって提供される多くの機能を実装します。

現在、独自のコード ベースを使用して、Linux、OS X、FreeBSD、および Python バージョン 2.4 から 3.1 の Windows をサポートしています。

于 2011-02-22T15:22:36.677 に答える
4

それはコピー&ペーストの完全なソリューションです:

def terminate_process(pid):
    # all this shit is because we are stuck with Python 2.5 and 
    # we cannot use Popen.terminate()
    if sys.platform == 'win32':
        import ctypes
        PROCESS_TERMINATE = 1
        handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, pid)
        ctypes.windll.kernel32.TerminateProcess(handle, -1)
        ctypes.windll.kernel32.CloseHandle(handle)
    else:
        os.kill(pid, signal.SIGKILL)

バグレポートをコメントとして受け付けます ;)

于 2011-12-16T15:40:08.203 に答える