web-dev-qa-db-ja.com

Python 2.5で、サブプロセスを強制終了するにはどうすればよいですか?

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

Linuxを2.5で実行していますが、下位互換性の理由から2.6にアップグレードできません。代替手段は何ですか?これらの関数は何かの便利な方法だと思います。

28
Uri

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

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

Linuxを使用しているので、大丈夫です。 Windowsユーザーは運が悪い。

41
Gareth Simpson

@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)ほどエレガントではありませんが、機能します;-)

40
Alex Martelli

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

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

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

6
ssoler

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

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)

コメントとしてバグレポートを受け入れる;)

4
sorin