在Python中,我可以阻止函数捕获KeyboardInterrupt和SystemExit吗?

Rya*_*son 6 python exception-handling

我正在用Python编写一些代码:

import sys
try:
    for x in large_list:
        function_that_catches_KeyboardInterrupt(x)
except KeyboardInterrupt:
    print "Canceled!"
    sys.exit(1)
Run Code Online (Sandbox Code Playgroud)

当我尝试中断循环时,我基本上需要按住Control+ C 足够长的时间来取消函数的所有调用,large-list然后才能退出.

有什么方法可以阻止该函数捕获KeyboardInterrupt,以便我自己能够捕获它吗?我能想到的唯一方法是通过创建一个单独的线程来滥用线程,只是为了调用函数,但这似乎是过分的.

编辑:我检查了有问题的代码(我不能轻易改变),它实际上使用裸except:,所以甚至sys.exit(1)被捕获为SystemExit异常.我如何逃离裸露的except:街区并退出我的计划?

ste*_*fan 6

您可以使用信号库重新绑定SIGINT处理程序.

import signal, sys
def handler(signal, frame):
    print "Canceled!"
    sys.exit(1)
signal.signal(signal.SIGINT, handler)
for x in large_list:
    function_that_catches_KeyboardInterrupt(x)
Run Code Online (Sandbox Code Playgroud)

SystemExit被抓住时,有几种方法可以退出.os._exit(1)将做一个没有清理的C风格退出.os.kill(os.getpid(), signal.SIGTERM)将允许解释器进行一定程度的清理,我相信刷新/关闭文件句柄等.