Python: 全局对象销毁

3

我有一个全局实例,我希望当Python解释器退出时销毁它(调用函数__del__)。我对Python解释器期望过高吗?我的测试方法是在__del__函数中放置一个打印语句,从命令行运行python.exe,然后按下Ctrl/Break。此时,我期望在命令行窗口中看到打印输出。但是,我没有看到。


好的,我注意到用 Ctrl/Break 终止 Python 解释器(del 不会被调用)和用 Ctrl/C 终止它时有所不同。因此,我认为 Ctrl/Break 会杀死进程,而 Ctrl/C 会正常结束进程。那么关闭窗口会发生什么呢?(也许这个问题应该在另一个论坛问问)。 - barak manos
还有一个相关的问题可能会引起您的兴趣:https://dev59.com/nWUq5IYBdhLWcg3wSOfR - mgilson
1
还有一个你不应该依赖__del__的原因:https://dev59.com/oW3Xa4cB1Zd3GeqPbzHq#14323849 - mgilson
2个回答

7

是的,你期望太高了。Python 不能保证 调用__del__

__del__() 方法不保证在解释器退出时调用仍存在的对象。

编辑:

通常情况下,应该避免使用__del__。对于大多数情况,上下文管理器更好。对于需要确保某些外部(即从C代码分配的)资源在解释器退出时得到清理的罕见情况,可以使用atexit模块


我的目标是在可执行实例(其中包含内存中的全局对象)终止之前将当前状态保存到数据库中。在析构函数中执行数据库操作在概念上是否有问题? - barak manos

4
您可以添加 signal.SIGBREAK 信号的处理程序。这将使您能够拦截 ctrl + break。请参考文档中的示例:
import signal, os

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

signal.signal(signal.SIGBREAK, handler)

这个能同时处理窗口的关闭吗? - barak manos
不,@Lqc的答案更合适。 - Jason Sperske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接