Is there some way in Python to capture KeyboardInterrupt
event without putting all the code inside a try
-except
statement?
I want to cleanly exit without trace if user presses Ctrl+C.
Is there some way in Python to capture KeyboardInterrupt
event without putting all the code inside a try
-except
statement?
I want to cleanly exit without trace if user presses Ctrl+C.
You can prevent printing a stack trace for
KeyboardInterrupt
, withouttry: ... except KeyboardInterrupt: pass
(the most obvious and propably "best" solution, but you already know it and asked for something else) by replacingsys.excepthook
. Something likeAn alternative to setting your own signal handler is to use a context-manager to catch the exception and ignore it:
This removes the
try
-except
block while preserving some explicit mention of what is going on.This also allows you to ignore the interrupt only in some portions of your code without having to set and reset again the signal handlers everytime.
If all you want is to not show the traceback, make your code like this:
(Yes, I know that this doesn't directly answer the question, but it's not really clear why needing a try/except block is objectionable -- maybe this makes it less annoying to the OP)
Yes, you can install an interrupt handler using the module signal, and wait forever using a threading.Event:
I know this is an old question but I came here first and then discovered the
atexit
module. I do not know about its cross-platform track record or a full list of caveats yet, but so far it is exactly what I was looking for in trying to handle post-KeyboardInterrupt
cleanup on Linux. Just wanted to throw in another way of approaching the problem.I want to do post-exit clean-up in the context of Fabric operations, so wrapping everything in
try
/except
wasn't an option for me either. I feel likeatexit
may be a good fit in such a situation, where your code is not at the top level of control flow.atexit
is very capable and readable out of the box, for example:You can also use it as a decorator (as of 2.6; this example is from the docs):
If you wanted to make it specific to
KeyboardInterrupt
only, another person's answer to this question is probably better.But note that the
atexit
module is only ~70 lines of code and it would not be hard to create a similar version that treats exceptions differently, for example passing the exceptions as arguments to the callback functions. (The limitation ofatexit
that would warrant a modified version: currently I can't conceive of a way for the exit-callback-functions to know about the exceptions; theatexit
handler catches the exception, calls your callback(s), then re-raises that exception. But you could do this differently.)For more info see:
atexit