在没有尝试的情况下在Python中捕获键盘中断
有没有在Python中捕获KeyboardInterrupt
事件的一些方法,而不是把所有的代码放在try
– except
语句中? 如果用户按下ctrl – c,我想干净地退出。
是的,您可以使用信号模块安装中断处理程序。
import signal import sys import time def signal_handler(signal, frame): print 'You pressed Ctrl+C!' sys.exit(0) signal.signal(signal.SIGINT, signal_handler) print 'Press Ctrl+C' while True: time.sleep(1)
如果你想要的只是不显示回溯,请使你的代码如下所示:
## all your app logic here def main(): ## whatever your app does. if __name__ == "__main__": try: main() except KeyboardInterrupt: # do nothing here pass
(是的,我知道这并不直接回答这个问题,但是为什么需要一个try / except块是不好的 – 也许这不会让OP很恼火)
设置自己的信号处理程序的替代方法是使用上下文pipe理器来捕获exception并忽略它:
>>> class CleanExit(object): ... def __enter__(self): ... return self ... def __exit__(self, exc_type, exc_value, exc_tb): ... if exc_type is KeyboardInterrupt: ... return True ... return exc_type is None ... >>> with CleanExit(): ... input() #just to test it ... >>>
这将删除try
– except
块,同时保留一些明确提及正在发生的事情。
这也允许你只在代码的某些部分忽略中断,而不必每次都重新设置和重置信号处理程序。
我知道这是一个老问题,但是我先来到这里,然后发现了atexit
模块。 我不知道它的跨平台跟踪logging或完整的注意事项,但到目前为止,正是我在试图处理Linux上的KeyboardInterrupt
后清理工作时所需要的。 只是想以另一种方式来解决问题。
我想在Fabric操作的上下文中进行退出后的清理,所以将所有内容都包含在try
/ except
中对我来说不是一个选项。 我觉得在某些情况下,如果你的代码不在控制stream的顶层,那么你可能会适合atexit
。
atexit
是非常有能力和可读性的,例如:
import atexit def goodbye(): print "You are now leaving the Python sector." atexit.register(goodbye)
你也可以使用它作为装饰器(从2.6版本;这个例子是从文档):
import atexit @atexit.register def goodbye(): print "You are now leaving the Python sector."
如果你只想使KeyboardInterrupt
具体,另一个人对这个问题的答案可能会更好。
但是请注意, atexit
模块只有70行代码,创build类似的版本来处理exception是不难的,例如将exception作为parameter passing给callback函数。 ( atexit
限制修改版本的限制:目前我无法想象出口callback函数知道exception的方法; atexit
处理程序捕获exception,调用您的callback,然后重新调用 – 引发exception,但你可以做不同的事情。)
更多信息请参阅:
- 官方文件在
atexit
- 本周的Python模块是一个很好的介绍
您可以防止为KeyboardInterrupt
打印堆栈跟踪,而不try: ... except KeyboardInterrupt: pass
(最明显,最好的“最好”的解决scheme,但你已经知道它并要求别的东西)通过replacesys.excepthook
。 就像是
def custom_excepthook(type, value, traceback): if type is KeyboardInterrupt: return # do nothing else: sys.__excepthook__(type, value, traceback)