Ctrl+ DDiferença para Windows e Linux
Acontece que, a partir do Python 3.6, o interpretador Python manipula Ctrl+ de maneira Cdiferente para Linux e Windows. Para Linux, Ctrl+ Ciria funcionar principalmente como esperado no entanto no Windows Ctrl+ C maioria não funciona, especialmente se Python está a executar o bloqueio de chamadas, tais como thread.join
ou à espera de resposta web. No time.sleep
entanto, ele funciona . Aqui está uma boa explicação do que está acontecendo no interpretador Python. Observe que Ctrl+ Cgera SIGINT
.
Solução 1: use Ctrl+ Breakou equivalente
Use os atalhos de teclado abaixo na janela do terminal / console, que serão gerados SIGBREAK
em um nível inferior no SO e encerrarão o interpretador Python.
Mac OS e Linux
Ctrl+ Shift+ \ou Ctrl+\
Windows :
- Geral: Ctrl+Break
- Dell: Ctrl+ Fn+ F6ou Ctrl+ Fn+S
- Lenovo: Ctrl+ Fn+ F11ou Ctrl+ Fn+B
- HP: Ctrl+ Fn+Shift
- Samsung: Fn+Esc
Solução 2: use a API do Windows
Abaixo estão as funções úteis que detectam o Windows e instalam o manipulador personalizado para Ctrl+ Cno 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)
Você pode usar acima desta forma:
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!
Solução 3: Método de votação
Não prefiro ou recomendo esse método, pois consome desnecessariamente o processador e a energia, afetando negativamente o desempenho.
tempo de importação da segmentação de importação
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