Ctrl+ DDiferencia para Windows y Linux
Resulta que a partir de Python 3.6, el intérprete de Python maneja Ctrl+ de manera Cdiferente para Linux y Windows. Para Linux, Ctrl+ Cfuncionaría sobre todo como era de esperar, sin embargo en Windows Ctrl+ C mayormente no funciona especialmente si se está ejecutando Python de bloqueo de llamadas, como thread.join
o en espera de la respuesta web. Sin embargo, funciona time.sleep
. Aquí está la buena explicación de lo que está sucediendo en el intérprete de Python. Tenga en cuenta que Ctrl+ Cgenera SIGINT
.
Solución 1: Use Ctrl+ Breako Equivalente
Use los métodos abreviados de teclado a continuación en la ventana de terminal / consola que generará SIGBREAK
en el nivel inferior en el sistema operativo y finalizará el intérprete de Python.
Mac OS y Linux
Ctrl+ Shift+ \o Ctrl+\
Ventanas :
- General: Ctrl+Break
- Dell: Ctrl+ Fn+ F6o Ctrl+ Fn+S
- Lenovo: Ctrl+ Fn+ F11o Ctrl+ Fn+B
- HP: Ctrl+ Fn+Shift
- Samsung: Fn+Esc
Solución 2: use la API de Windows
A continuación se presentan funciones prácticas que detectarán Windows e instalarán un controlador personalizado para Ctrl+ Cen la consola:
#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)
Puede usar arriba de esta manera:
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!
Solución 3: método de votación
No prefiero ni recomiendo este método porque consume innecesariamente el procesador y la energía afecta negativamente el rendimiento.
tiempo de importación de subprocesos de importación
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