shutdown发送SIGTERM信号,atexit无法处理.背景管理者也不会,最后是块等.
import signal
signal.getsignal(signal.SIGTERM)
Out[64]: 0 #i.e. nothing
与此对比,比如ctrl-C:
signal.getsignal(signal.SIGINT)
Out[65]: #i.e. something
你可以用信号注册你的byebye函数来运行而不是什么都不做(这会导致解释器最终被shell杀死)
signal.signal(signal.SIGTERM,byebye)
如果你这样做,你需要做两件事:
>更改byebye的签名以接受信号将传递给它的两个参数.
>你应该做一些事情,比如在你的byebye函数结束时调用sys.exit()以允许python优雅地关闭商店.
你也可以做一些信号和atexit的组合:
import sys
signal.signal(signal.SIGTERM, lambda num, frame: sys.exit(0))
哪个会直接进入您当前的代码.这样可以确保清理操作的原子性(即byebye保证是最后的I / O操作),但代价是有点笨重.