Existe alguma maneira no Python de capturar KeyboardInterrupt
eventos sem colocar todo o código dentro de uma instrução try
- except
?
Desejo sair sem deixar rastros se o usuário pressionar Ctrl+ C.
Existe alguma maneira no Python de capturar KeyboardInterrupt
eventos sem colocar todo o código dentro de uma instrução try
- except
?
Desejo sair sem deixar rastros se o usuário pressionar Ctrl+ C.
Sim, você pode instalar um manipulador de interrupção usando o sinal do módulo e esperar para sempre usando um threading . Evento :
import signal
import sys
import time
import threading
def signal_handler(signal, frame):
print('You pressed Ctrl+C!')
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print('Press Ctrl+C')
forever = threading.Event()
forever.wait()
while True: continue
. (Nesse estilo,while True: pass
seria mais puro, de qualquer maneira.) Isso seria um grande desperdício; tente algo comowhile True: time.sleep(60 * 60 * 24)
(dormir um dia de cada vez é uma figura inteiramente arbitrária).time
(como deveria), não se esqueça deimport time
:)Se tudo o que você quer é não mostrar o traceback, faça seu código assim:
(Sim, eu sei que isso não responde diretamente à pergunta, mas não está muito claro por que a necessidade de um bloco try / except é questionável - talvez isso o torne menos incômodo para o OP)
fonte
signal.signal( signal.SIGINT, lambda s, f : sys.exit(0))
sempre faz.Uma alternativa para definir seu próprio manipulador de sinal é usar um gerenciador de contexto para capturar a exceção e ignorá-la:
Isso remove o bloco
try
-except
enquanto preserva alguma menção explícita do que está acontecendo.Isso também permite que você ignore a interrupção apenas em algumas partes do seu código, sem ter que definir e redefinir novamente os manipuladores de sinal todas as vezes.
fonte
Eu sei que esta é uma pergunta antiga, mas eu vim aqui primeiro e depois descobri o
atexit
módulo. Não sei sobre seu histórico de plataforma cruzada ou uma lista completa de advertências ainda, mas até agora é exatamente o que eu estava procurando ao tentar lidar com o pós-KeyboardInterrupt
limpeza no Linux. Só queria apresentar outra maneira de abordar o problema.Quero fazer uma limpeza pós-saída no contexto das operações do Fabric, portanto, encerrar tudo
try
/except
não era uma opção para mim também. Acho queatexit
pode ser um bom ajuste em tal situação, onde seu código não está no nível superior do fluxo de controle.atexit
é muito capaz e legível fora da caixa, por exemplo:Você também pode usá-lo como um decorador (a partir de 2.6; este exemplo é dos documentos):
Se você quiser torná-lo específico
KeyboardInterrupt
apenas para , a resposta de outra pessoa a essa pergunta provavelmente é melhor.Mas observe que o
atexit
módulo tem apenas ~ 70 linhas de código e não seria difícil criar uma versão semelhante que trate as exceções de maneira diferente, por exemplo, passando as exceções como argumentos para as funções de retorno de chamada. (A limitaçãoatexit
disso garantiria uma versão modificada: atualmente, não consigo conceber uma maneira de as funções de retorno de chamada de saída saberem sobre as exceções; oatexit
manipulador captura a exceção, chama seu (s) retorno (ões) de chamada e aumenta novamente essa exceção. Mas você poderia fazer isso de forma diferente.)Para obter mais informações, consulte:
atexit
fonte
Você pode evitar a impressão de um rastreamento de pilha para
KeyboardInterrupt
, semtry: ... except KeyboardInterrupt: pass
(a solução mais óbvia e provavelmente a "melhor", mas você já a conhece e pediu outra coisa) substituindosys.excepthook
. Algo comofonte
Tentei as soluções sugeridas por todos, mas tive que improvisar o código sozinho para fazê-lo funcionar. A seguir está meu código improvisado:
fonte
Se alguém está em busca de uma solução rápida e mínima,
fonte