Python で subprocess パッケージを使用してサブプロセスを実行していますが、後でこれを強制終了する必要があります。ただし、subprocess パッケージのドキュメントには、terminate() 関数は 2.6 以降でのみ使用できると記載されています。
Linux 2.5 を実行していますが、下位互換性のために 2.6 にアップグレードできません。代替手段は何ですか? これらの関数は、何かの便利なメソッドであると推測しています。
Python で subprocess パッケージを使用してサブプロセスを実行していますが、後でこれを強制終了する必要があります。ただし、subprocess パッケージのドキュメントには、terminate() 関数は 2.6 以降でのみ使用できると記載されています。
Linux 2.5 を実行していますが、下位互換性のために 2.6 にアップグレードできません。代替手段は何ですか? これらの関数は、何かの便利なメソッドであると推測しています。
プロセス pid で os.kill を呼び出します。
os.kill(process.pid, signal.SIGKILL)
Linux を使用しているため、問題ありません。Windows ユーザーは不運です。
@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)が、機能します;-)
@Gareth と @Alex の回答を完成させるために、基になるシステムに煩わされたくない場合は、psutilを使用できます。
psutil は、実行中のプロセスとシステム使用率 (CPU、メモリ) に関する情報を Python を使用して移植可能な方法で取得するためのインターフェイスを提供するモジュールであり、ps、top、kill、Windows タスク マネージャーなどのコマンド ライン ツールによって提供される多くの機能を実装します。
現在、独自のコード ベースを使用して、Linux、OS X、FreeBSD、および Python バージョン 2.4 から 3.1 の Windows をサポートしています。
それはコピー&ペーストの完全なソリューションです:
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)
バグレポートをコメントとして受け付けます ;)