Pythonでサブプロセスを実行するためにサブプロセスパッケージを使用していますが、後で強制終了する必要があります。ただし、サブプロセスパッケージのドキュメントには、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は、Pythonを使用して、実行中のプロセスとシステム使用率(CPU、メモリ)に関する情報を移植可能な方法で取得するためのインターフェイスを提供するモジュールであり、ps、top、kill、Windowsタスクマネージャーなどのコマンドラインツールによって提供される多くの機能を実装します。
現在、Linux、OS X、FreeBSD、およびWindowsをサポートしており、独自のコードベースを使用してPythonバージョン2.4から3.1までです。
それはコピー&ペースの完全なソリューションです:
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)
コメントとしてバグレポートを受け入れる;)