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.joino 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á SIGBREAKen 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