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.join
ou 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 SIGBREAK
au 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