是否有某种方式在蟒蛇捕捉 KeyboardInterrupt 事件没有把所有的代码里 try-except 发言?

我要清洁地退出而不追踪,如果用户按下 Ctrl+C.

有帮助吗?

解决方案

是,可以安装使用模块信号一个中断处理程序,并永远等待使用 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()

其他提示

如果你想要的是不显示的回溯,使你的代码是这样的:

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

替代设置自己的信号处理程序是使用环境-经理抓的例外和忽视:

>>> 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 模块。我不知道关于它的跨平台跟踪记录或一个完整的清单的警告,但到目前为止,这正是我寻找的在试图处理后KeyboardInterrupt 清理在Linux。只是想扔中的另一个方法接近的问题。

我想退出后的清理下物的操作,因此环绕的一切 try/except 不是一个选项我。我觉得像 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行代码和它不会是很难建立一个类似的版本,对待的例外情况不同,例如通过例外情况作为参数的回呼功能。(限制 atexit 这将需要修改后的版本:目前我无法想象的方式为出回呼功能知道关于例外情况;的 atexit 处理程序渔获物的例外,要求你回调(s),然后重新提出了这一例外。但你能做这个是不同的。)

更多的信息见:

您可以防止印刷为KeyboardInterrupt堆栈跟踪,没有try: ... except KeyboardInterrupt: pass(最明显和最propably“最佳”的解决方案,但你已经知道了,问其他的东西),用的 sys.excepthook 。类似

def custom_excepthook(type, value, traceback):
    if type is KeyboardInterrupt:
        return # do nothing
    else:
        sys.__excepthook__(type, value, traceback)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top