Ctrl+ DDifférence pour Windows et Linux
Il s'avère qu'à partir de Python 3.6, l'interpréteur Python gère Ctrl+ Cdifféremment pour Linux et Windows. Pour Linux, Ctrl+ Cfonctionnerait essentiellement comme prévu mais sur Windows Ctrl+ la C plupart du temps ne fonctionne pas , surtout si Python est le blocage des appels en cours d' exécution tels que thread.joinou en attente de la réponse Web. Cela fonctionne pour time.sleep, cependant. Voici la belle explication de ce qui se passe dans l'interpréteur Python. Notez que Ctrl+ Cgénère SIGINT.
Solution 1: utiliser Ctrl+ Breakou équivalent
Utilisez ci-dessous les raccourcis clavier dans la fenêtre du terminal / console qui généreront SIGBREAKau niveau inférieur du système d'exploitation et mettront fin à l'interpréteur Python.
Mac OS et Linux
Ctrl+ Shift+ \ou Ctrl+\
Windows :
- Général: Ctrl+Break
- Dell: Ctrl+ Fn+ F6ou Ctrl+ Fn+S
- Lenovo: Ctrl+ Fn+ F11ou Ctrl+ Fn+B
- HP: Ctrl+ Fn+Shift
- Samsung: Fn+Esc
Solution 2: utiliser l'API Windows
Vous trouverez ci-dessous des fonctions pratiques qui détecteront Windows et installeront le gestionnaire personnalisé pour Ctrl+ Cdans la 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)
Vous pouvez utiliser ci-dessus comme ceci:
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!
Solution 3: méthode d'interrogation
Je ne préfère ni ne recommande cette méthode car elle consomme inutilement du processeur et de l'énergie, ce qui a un impact négatif sur les performances.
importation du temps d'importation des threads
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