在Python中无需try-except捕获键盘中断

122 投票
7 回答
156100 浏览
提问于 2025-04-16 07:13

有没有什么方法可以在Python中捕捉到KeyboardInterrupt事件,而不需要把所有代码都放在try-except语句里面呢?

我想要在用户按下Ctrl+C的时候,能够干净利落地退出,而不留下任何痕迹。

7 个回答

33

一个替代自己设置信号处理器的方法是使用上下文管理器来捕捉异常并忽略它:

>>> 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 这段代码,同时还能清楚地说明发生了什么。

这也让你可以只在代码的某些部分忽略中断,而不需要每次都去设置和重置信号处理器。

44

如果你只是想不显示错误追踪信息,可以把你的代码写成这样:

## all your app logic here
def main():
   ## whatever your app does.


if __name__ == "__main__":
   try:
      main()
   except KeyboardInterrupt:
      # do nothing here
      pass

(是的,我知道这并没有直接回答问题,但其实不太清楚为什么需要使用try/except块会让人觉得不舒服——也许这样做会让提问者觉得好一些)

172

是的,你可以使用一个叫做 signal 的模块来安装一个中断处理器,然后使用 threading.Event 来让程序一直等待下去:

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()

撰写回答