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

时间:2012-01-26 20:48:17

标签: python exception-handling

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

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

当我尝试中断循环时,我基本上需要按住 Control + C 足以取消{{的所有元素的函数的每次调用。 1}},然后我的程序退出。

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

编辑:我检查了有问题的代码(我无法轻易更改),它实际上使用了一个裸large-list,因此即使except:也会被sys.exit(1)异常捕获。如何逃离裸SystemExit块并退出程序?

1 个答案:

答案 0 :(得分:6)

您可以使用signal库重新绑定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)

SystemExit被捕获时,有几种方法可以退出。 os._exit(1)将执行c样式退出而不进行清理。 os.kill(os.getpid(), signal.SIGTERM)将允许解释器进行一定程度的清理,我相信刷新/关闭文件句柄等。