with GracefulInterruptHandler() as h:
for i in xrange(1000):
print "..."
time.sleep(1)
if h.interrupted:
print "interrupted!"
time.sleep(2)
break
嵌套处理程序:
with GracefulInterruptHandler() as h1:
while True:
print "(1)..."
time.sleep(1)
with GracefulInterruptHandler() as h2:
while True:
print "\t(2)..."
time.sleep(1)
if h2.interrupted:
print "\t(2) interrupted!"
time.sleep(2)
break
if h1.interrupted:
print "(1) interrupted!"
time.sleep(2)
break
10 回答
使用
signal.signal
注册您的处理程序,如下所示:代码改编自here .
有关
signal
的更多文档可以在here找到 .您可以将其视为异常(KeyboardInterrupt),就像任何其他异常一样 . 创建一个新文件并使用以下内容从shell运行它以查看我的意思:
作为上下文管理器:
使用:
嵌套处理程序:
从这里:https://gist.github.com/2907502
您可以通过捕获
KeyboardInterrupt
异常来处理CTRL C.您可以在异常处理程序中实现任何清理代码 .来自Python的documentation:
又一个片段
将
main
称为主函数,将exit_gracefully
称为CTRL c处理程序我调整了@udi的代码来支持多个信号(没什么特别的):
此代码支持键盘中断调用(
SIGINT
)和SIGTERM
(kill <process>
)您可以使用Python内置的signal module中的函数在python中设置信号处理程序 . 具体来说,
signal.signal(signalnum, handler)
函数用于为信号signalnum
注册handler
函数 .与Matt J他的回答相反,我使用了一个简单的对象 . 这使我有可能将此处理程序解析为需要停止securlery的所有线程 .
别处
就个人而言,我无法使用try / except KeyboardInterrupt,因为我使用的是阻塞的标准套接字(IPC)模式 . 所以SIGINT被提示了,但只是在接收到套接字上的数据后才出现 .
设置信号处理程序的行为相同 .
另一方面,这仅适用于实际终端 . 其他启动环境可能不接受Ctrl C或预处理信号 .
此外,Python中有“Exceptions”和“BaseExceptions”,它们在解释器需要自己完全退出的意义上有所不同,因此一些异常具有比其他异常更高的优先级(Exceptions派生自BaseException)