Python:全局对象销毁
我有一个全局实例,我希望在Python解释器退出时销毁它(调用函数__del__
)。我是否期待太多的Python解释器? 我的测试方法是在__del__
函数中打印,从命令行运行python.exe
,然后按Ctrl/Break。此时,我希望在命令行窗口中看到打印内容。但是,我没有。Python:全局对象销毁
是的,你期待太多。 Python的doesn't make any guarantees有关调用__del__
:
它不能保证
__del__()
方法要求仍然存在时解释退出的对象。
编辑:
一般来说,你应该避免使用__del__
。对于大多数情况,上下文管理者更好对于极少数情况,当您需要确保在解释器退出时清除某些外部(即从C代码分配的)资源时,可以使用atexit
module。
我的目标是在可执行实例(包含内存中的全局对象)终止之前将当前状态保存到数据库中。在析构函数中执行数据库操作在概念上是错误的吗? – 2013-03-20 23:37:17
您可以为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)
这句柄关闭窗户呢? – 2013-03-20 23:33:04
编号@Lqc的回答更合适 – 2013-03-20 23:34:04
非常感谢! – 2013-03-20 23:39:05
好的,我已经注意到用Ctrl/Break(__del__未调用)和Ctrl/C(__del__调用)终止Python解释器的区别。因此,我假设Ctrl/Break杀死进程,而Ctrl/C正确结束。那么关闭窗户我应该期待什么呢? (也许这个问题应该在不同的论坛上提出)。 – 2013-03-20 23:30:18
也感兴趣:http://stackoverflow.com/q/14628486/748858 – mgilson 2013-03-20 23:41:43
另一个原因,你不应该'__del__':http://stackoverflow.com/a/14323849/748858 – mgilson 2013-03-20 23:45:29