2013-03-20 107 views
3

我有一个全局实例,我希望在Python解释器退出时销毁它(调用函数__del__)。我是否期待太多的Python解释器? 我的测试方法是在__del__函数中打印,从命令行运行python.exe,然后按Ctrl/Break。此时,我希望在命令行窗口中看到打印内容。但是,我没有。Python:全局对象销毁

+0

好的,我已经注意到用Ctrl/Break(__del__未调用)和Ctrl/C(__del__调用)终止Python解释器的区别。因此,我假设Ctrl/Break杀死进程,而Ctrl/C正确结束。那么关闭窗户我应该期待什么呢? (也许这个问题应该在不同的论坛上提出)。 – 2013-03-20 23:30:18

+0

也感兴趣:http://stackoverflow.com/q/14628486/748858 – mgilson 2013-03-20 23:41:43

+1

另一个原因,你不应该'__del__':http://stackoverflow.com/a/14323849/748858 – mgilson 2013-03-20 23:45:29

回答

6

是的,你期待太多。 Python的doesn't make any guarantees有关调用__del__

它不能保证__del__()方法要求仍然存在时解释退出的对象。

编辑:

一般来说,你应该避免使用__del__。对于大多数情况,上下文管理者更好对于极少数情况,当您需要确保在解释器退出时清除某些外部(即从C代码分配的)资源时,可以使用atexit module

+0

我的目标是在可执行实例(包含内存中的全局对象)终止之前将当前状态保存到数据库中。在析构函数中执行数据库操作在概念上是错误的吗? – 2013-03-20 23:37:17

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) 
+0

这句柄关闭窗户呢? – 2013-03-20 23:33:04

+0

编号@Lqc的回答更合适 – 2013-03-20 23:34:04

+0

非常感谢! – 2013-03-20 23:39:05