在Python中,如何防止函数捕获KeyboardInterrupt和SystemExit?
我正在写一些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)
则可以让解释器进行一些清理工作,比如刷新或关闭文件句柄等。