Ctrl+ DDifferenza per Windows e Linux
Si scopre che a partire da Python 3.6, l'interprete Python gestisce Ctrl+ in modo Cdiverso per Linux e Windows. Per Linux, Ctrl+ Cfunzionerebbe principalmente come previsto, tuttavia su Windows Ctrl+ C per lo più non funziona soprattutto se Python sta eseguendo il blocco di chiamate come thread.joino in attesa di risposta web. Funziona time.sleepcomunque. Ecco la bella spiegazione di cosa sta succedendo nell'interprete Python. Si noti che Ctrl+ Cgenera SIGINT.
Soluzione 1: utilizzare Ctrl+ Breako equivalente
Utilizzare le scorciatoie da tastiera sottostanti nella finestra del terminale / console che genererà SIGBREAKa un livello inferiore nel sistema operativo e terminerà l'interprete Python.
Mac OS e Linux
Ctrl+ Shift+ \o Ctrl+\
Windows :
- Generale: Ctrl+Break
- Dell: Ctrl+ Fn+ F6o Ctrl+ Fn+S
- Lenovo: Ctrl+ Fn+ F11o Ctrl+ Fn+B
- HP: Ctrl+ Fn+Shift
- Samsung: Fn+Esc
Soluzione 2: utilizzare l'API di Windows
Di seguito sono riportate utili funzioni che rileveranno Windows e installeranno il gestore personalizzato per Ctrl+ Cnella console:
#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)
Puoi usare sopra in questo modo:
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!
Soluzione 3: metodo di polling
Non preferisco né raccomando questo metodo perché consuma inutilmente processore e potenza influendo negativamente sulle prestazioni.
import threading tempo di importazione
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