为了账号安全,请及时绑定邮箱和手机立即绑定

无需尝试即可在Python中捕获键盘中断

无需尝试即可在Python中捕获键盘中断

鸿蒙传说 2019-11-11 10:28:09
Python中是否有某种方法可以捕获KeyboardInterrupt事件而不将所有代码放在try- except语句中?如果用户按下Ctrl+,我想干净地退出而没有任何痕迹C。
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

是的,您可以使用模块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()


查看完整回答
反对 回复 2019-11-11
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

如果您只想不显示回溯,则使代码如下所示:


## 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的困扰)


查看完整回答
反对 回复 2019-11-11
?
Qyouu

TA贡献1786条经验 获得超11个赞

设置自己的信号处理程序的另一种方法是使用上下文管理器来捕获异常并忽略它:


>>> 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块,同时保留一些明确的说明。


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


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 1393 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信