【问题标题】:Python: Global Object Destruction [duplicate]Python:全局对象破坏
【发布时间】:2013-03-21 07:41:33
【问题描述】:

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

【问题讨论】:

  • 好的,我注意到使用 Ctrl/Break(del 未调用)和 Ctrl/C(del称为)。因此,我假设 Ctrl/Break 会终止该进程,而 Ctrl/C 会正确结束它。那么我应该从关闭窗口中得到什么? (也许这个问题应该在不同的论坛提出)。
  • 还有一个你不应该依赖__del__的原因:stackoverflow.com/a/14323849/748858

标签: python


【解决方案1】:

是的,你期望太高了。 Pythondoesn't make any guarantees关于调用__del__

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

编辑:

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

【讨论】:

  • 我的目标是在可执行实例(包含内存中的全局对象)终止之前将当前状态保存到数据库中。在析构函数中执行 DB 操作在概念上是错误的吗?
【解决方案2】:

您可以为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)

【讨论】:

  • 这个句柄也能关闭窗口吗?
  • 没有。 @Lqc 的答案更合适
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2020-02-15
  • 1970-01-01
  • 2017-12-26
  • 2010-12-25
相关资源
最近更新 更多