在没有尝试的情况下在Python中捕获键盘中断

有没有在Python中捕获KeyboardInterrupt事件的一些方法,而不是把所有的代码放在tryexcept语句中? 如果用户按下ctrlc,我想干净地退出。

是的,您可以使用信号模块安装中断处理程序。

 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 ... >>> 

这将删除tryexcept块,同时保留一些明确提及正在发生的事情。

这也允许你只在代码的某些部分忽略中断,而不必每次都重新设置和重置信号处理程序。

我知道这是一个老问题,但是我先来到这里,然后发现了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)