在Python中,如何防止函数捕获KeyboardInterrupt和SystemExit?

7 投票
1 回答
1087 浏览
提问于 2025-04-17 11:10

我正在写一些Python代码,像这样:

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

当我尝试中断这个循环时,我基本上需要长按 Control + C,这样才能取消对 large-list 中所有元素的函数调用,只有这样我的程序才会退出。

有没有办法让我自己捕捉到这个中断,而不是让函数去捕捉?我唯一想到的办法就是使用线程,专门开一个新线程来调用这个函数,但这似乎有点过于复杂了。

补充:我检查了那段有问题的代码(我不容易修改),它实际上使用了一个裸的 except:,所以即使是 sys.exit(1) 也会被当作 SystemExit 异常捕捉到。我该如何逃出这个裸的 except: 块,退出我的程序呢?

1 个回答

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) 则可以让解释器进行一些清理工作,比如刷新或关闭文件句柄等。

撰写回答