Ich benutze Python, um ein C++ - Programm mit dem Unterprozessmodul aufzurufen. Da das Programm einige Zeit benötigt, möchte ich es mit Strg + C beenden können. Ich habe ein paar Fragen dazu auf StackOverflow gesehen, aber keine der Lösungen scheint für mich zu funktionieren.Beenden eines Subprozesses mit KeyboardInterrupt
Was ich möchte ist, dass der Unterprozess auf KeyboardInterrupt beendet wird. Dies ist der Code, den ich (ähnlich Vorschläge in anderen Fragen) haben:
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()
Allerdings, wenn ich dies ausführen, wird der Code hing für den Prozess wartet bis zu beenden und registriert nie die KeyboardInterrupt. Ich habe folgend auch versucht:
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()
Diese Code-Schnipsel funktioniert gut an das Programm beendet wird, so dass es nicht das eigentliche Signal ist, dass das ist das Problem zu beenden gesendet werden wird.
Wie kann ich den Code ändern, damit der Unterprozess auf KeyboardInterrupt beendet werden kann?
Ich verwende Python 2.7 und Windows 7 64-Bit. Danke im Voraus!
Einige verwandte Fragen, die ich versucht:
Kill subprocess.call after KeyboardInterrupt
kill subprocess when python process is killed?
Warum fangen Sie nicht das Signal ctrl-c in Ihrem Hauptprogramm und verwenden Sie das, um 'proc.terminate()' aufzurufen? – CoconutBandit
In Python 3 könnten Sie '_winapi.WaitForMultipleObjects ([proc._handle], False, -1)' verwenden. Für den Hauptthread und wenn das wait-all-Flag false ist, schließt diese Wartezeit automatisch das "SIGINT" -Ereignis von Python ein. In 2.x müssten Sie dies von Grund auf mit Ctypes oder PyWin32 implementieren. – eryksun
@eryksun Danke für den Vorschlag.Es gibt ein Modul namens win32event, das eine ähnliche Funktion hat und für Python 2 importiert werden kann, aber ich habe 'win32event.WaitForMultipleObjects ([proc._handle], False, -1)' versucht und es hat keinen Unterschied gemacht. – limi44