我有一个全局实例,当Python解释器退出时,我希望它被销毁(函数__del__
被调用)。我是否期望过多的Python解释器?
我测试它的方法是在__del__
函数中打印,从命令行运行python.exe
,然后按Ctrl / Break。此时,我希望在命令行窗口中看到打印。但是,我没有。
答案 0 :(得分:6)
是的,你期待的太多了。关于调用__del__
的Python doesn't make any guarantees:
无法保证在解释器退出时仍然存在的对象调用
__del__()
方法。
编辑:
通常,您应该避免使用__del__
。对于大多数情况,上下文管理器更好对于极少数情况,当您需要确保在解释器退出时清除某些外部(即从C代码分配)资源时,可以使用atexit
module。
答案 1 :(得分:3)
您可以为signal.SIGBREAK
信号添加处理程序。这样您就可以拦截ctrl
+ break
。表格the documentation:
import signal, os
def handler(signum, frame):
print 'Someone is trying to exit!', signum
signal.signal(signal.SIGBREAK, handler)