私はサブプロセスモジュールを使ってPythonを使ってC++プログラムを呼び出しています。プログラムの実行には時間がかかりますので、Ctrl + Cで終了することができます。私はStackOverflowでこれに関するいくつかの質問を見てきましたが、解決策のどれも私のために働くようです。KeyboardInterruptでサブプロセスを終了する
私は、サブプロセスがKeyboardInterruptで終了することを望みます。これは私が(他の質問で提案と同様に)持っているコードです:私はこれを実行する場合
import subprocess
binary_path = '/path/to/binary'
args = 'arguments' # arbitrary
call_str = '{} {}'.format(binary_path, args)
proc = subprocess.Popen(call_str)
try:
proc.wait()
except KeyboardInterrupt:
proc.terminate()
しかし、コードは、プロセスが終了するのを待ってハングアップ、決してKeyboardInterruptを登録しています。私も次のことを試してみました:
import subprocess
import time
binary_path = '/path/to/binary'
args = 'arguments' # arbitrary
call_str = '{} {}'.format(binary_path, args)
proc = subprocess.Popen(call_str)
time.sleep(5)
proc.terminate()
このコードスニペットは、プログラムを終了時に正常に動作しますので、それはそれは問題で終了するために送信されています実際の信号ではありません。
KeyboardInterruptでサブプロセスを終了できるようにコードを変更するにはどうすればよいですか?
私はPython 2.7とWindows 7 64ビットを実行しています。前もって感謝します!
私が試したいくつかの関連質問:Windows上
Kill subprocess.call after KeyboardInterrupt
kill subprocess when python process is killed?
あなたのメインプログラムでctrl-cシグナルを捕まえて、それを使って 'proc.terminate()'を呼び出すのはどうですか? – CoconutBandit
Python 3では '_winapi.WaitForMultipleObjects([proc._handle]、False、-1)'を使うことができます。メインスレッドでwait-allフラグがfalseの場合、この待機は自動的にPythonの 'SIGINT'イベントを含みます。 2.xでは、ctypesやPyWin32を使ってゼロから実装する必要があります。 – eryksun
@eryksun提案をいただきありがとうございます。同様の機能を持ち、Python 2用にインポートできるwin32eventというモジュールがありますが、 'win32event.WaitForMultipleObjects([proc._handle]、False、-1)'を試しましたが、違いはありませんでした。 – limi44