Python: 全局对象销毁

3 投票
2 回答
1652 浏览
提问于 2025-04-17 19:49

我有一个全局实例,我希望在Python解释器退出时能被销毁(也就是调用__del__函数)。我是不是对Python解释器的期望太高了?

我测试这个的方法是,在__del__函数里加一个打印语句,然后从命令行运行python.exe,接着按下Ctrl/Break。这个时候,我本来期待能在命令行窗口看到打印的内容,但实际上并没有看到。

2 个回答

4

你可以为 signal.SIGBREAK 信号添加一个处理器。这样你就可以拦截 ctrl + break 的组合键了。具体内容可以参考 文档

import signal, os

def handler(signum, frame):
    print 'Someone is trying to exit!', signum

signal.signal(signal.SIGBREAK, handler)
7

是的,你的期待有点高。Python 并不能保证会调用 __del__

当解释器退出时,并不能保证仍然存在的对象会调用 __del__() 方法。

补充:

一般来说,你应该尽量避免使用 __del__。在大多数情况下,使用上下文管理器会更好。如果你遇到一种很少见的情况,需要确保一些外部资源(比如从C代码分配的资源)在解释器退出时被清理,可以使用 atexit 模块

撰写回答