Ctrl+ DUnterschied für Windows und Linux
Es stellt sich heraus, dass der Python-Interpreter ab Python 3.6 für Linux und Windows Ctrl+ Cunterschiedlich behandelt. Unter Linux würde Ctrl+ meistens wie erwartet funktionieren, unter Windows + jedoch meistens nicht, insbesondere wenn Python einen blockierenden Aufruf ausführt, z. B. auf eine Webantwort wartet. Es funktioniert jedoch für. Hier ist die nette Erklärung, was im Python-Interpreter vor sich geht. Beachten Sie, dass + generiert .CCtrlC thread.join
time.sleep
CtrlCSIGINT
Lösung 1: Verwenden Sie Ctrl+ Breakoder Äquivalent
Verwenden Sie die folgenden Tastenkombinationen im Terminal- / Konsolenfenster, die SIGBREAK
im Betriebssystem auf einer niedrigeren Ebene generiert werden, und beenden Sie den Python-Interpreter.
Mac OS und Linux
Ctrl+ Shift+ \oder Ctrl+\
Windows :
- Allgemein: Ctrl+Break
- Dell: Ctrl+ Fn+ F6oder Ctrl+ Fn+S
- Lenovo: Ctrl+ Fn+ F11oder Ctrl+ Fn+B
- HP: Ctrl+ Fn+Shift
- Samsung: Fn+Esc
Lösung 2: Verwenden Sie die Windows-API
Im Folgenden finden Sie nützliche Funktionen, mit denen Windows erkannt und ein benutzerdefinierter Handler für Ctrl+ Cin der Konsole installiert werden kann :
#win_ctrl_c.py
import sys
def handler(a,b=None):
sys.exit(1)
def install_handler():
if sys.platform == "win32":
import win32api
win32api.SetConsoleCtrlHandler(handler, True)
Sie können oben wie folgt verwenden:
import threading
import time
import win_ctrl_c
# do something that will block
def work():
time.sleep(10000)
t = threading.Thread(target=work)
t.daemon = True
t.start()
#install handler
install_handler()
# now block
t.join()
#Ctrl+C works now!
Lösung 3: Abfragemethode
Ich bevorzuge oder empfehle diese Methode nicht, da sie unnötigerweise Prozessor verbraucht und die Leistung negativ beeinflusst.
Import Threading Importzeit
def work():
time.sleep(10000)
t = threading.Thread(target=work)
t.daemon = True
t.start()
while(True):
t.join(0.1) #100ms ~ typical human response
# you will get KeyboardIntrupt exception