我正在用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
块并退出程序?
答案 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)
将允许解释器进行一定程度的清理,我相信刷新/关闭文件句柄等。