- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为日志记录模块编写了一个包装类,它具有 __del__ 方法来在程序末尾删除日志文件。
我的程序将此日志文件从其他类复制到存档中,并且在下一个程序执行之前工作文件夹中没有日志文件很重要。但我无法从其他模块中删除它,因为它们仍然由记录器处理。
所以我为此使用了 __del__ 方法。
def __del__(self):
if self.config_object.logfile is not None:
import os
try:
os.unlink(self.config_object.logfile)
except (WindowsError, AttributeError):
pass
我重新导入 os,因为有时 in 已在我的 Logging 类之前被垃圾收集器销毁。这在 python3.2 中工作正常
但是切换到 python3.4 后我看到了这样的错误:
File "<frozen importlib._bootstrap>", line 2236, in _find_and_load
File "<frozen importlib._bootstrap>", line 263, in __enter__
File "<frozen importlib._bootstrap>", line 287, in _get_module_lock
File "<frozen importlib._bootstrap>", line 173, in __init__
TypeError: 'NoneType' object is not callable
我尝试阻止操作系统删除而不是重新导入操作系统,但失败了。
我尝试过这个想法:使用内部 os 创建循环引用。在我的类(class)中添加带有 os 模块的字段。直接调用 gc.disabled()。但他们都没有帮助。
所以我有两个问题。第一个是当 python 程序被垃圾收集器销毁时,如何使用新的 importlib 重新导入 python 3.4 中的操作系统。其次是如何防止垃圾收集器删除 os 模块。
附注我知道使用上下文管理器比 __del__ 更好,并阅读有关此 iat SO 的问题。当然,我可以更改程序逻辑以避免删除日志文件。所以这个log的问题只是一个例子,唤醒了我的好奇心。如果有人能证明我的两个目标都是不可能的,那就可以了,也是最好的答案。但是,如果存在一个丑陋且非Pythonic的解决方案,我想知道它,即使它正在以某种方式直接改变字节码或类似的东西。
最佳答案
您可以将对 os.unlink()
函数的引用绑定(bind)为默认参数,因此当 Hook 运行时您仍然可以访问该函数:
def __del__(self, _os_unlink=os.unlink):
if self.config_object.logfile is not None:
import os
try:
_os_unlink(self.config_object.logfile)
except (WindowsError, AttributeError):
pass
但是,请考虑到永远无法保证钩子(Hook)在 Python 关闭时执行。
此外,如果您需要调用碰巧在纯 python 中实现的其他函数,那么您需要考虑这些函数也可能使用已设置为 None
的依赖项此时。您可能必须使用“捕获的”引用重新实现这些函数,或者必须为您的调用恢复依赖项。例如,os.path.exists()
需要 os.stat()
仍然可用。要么用捕获的 genericpath.exists()
重新实现 os.stat
function,要么至少在调用捕获的 os.stat
函数之前确保 os.path.exists()
存在。
关于python - 如何防止模块被垃圾收集器删除或在 __del__ 方法内重新导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122737/
我有一些 test.py 文件: class A: def __init__(self): print("A init") def __del__(self):
这个问题在这里已经有了答案: What is the __del__ method and how do I call it? (5 个答案) 关闭 3 年前。 经过多次检查,我确实发现了关于该主题
在使用 multiprocessing 时,我注意到在下面的脚本中,__del__ 被调用了两次(一次在子进程中,一次在父进程中)。 class myclass(object): def __
我正试图将一个写得不好的 Python 模块(我无法控制)包装在一个类中。问题是,如果我没有明确调用该模块的 close 函数,那么 python 进程会在退出时挂起,因此我试图用一个具有 del 方
我正在尝试使用静态列表创建一个类,它收集一个对象类的所有新实例。我面临的问题似乎是,一旦我尝试以与整数相同的方式使用列表,我就不能再使用魔法标记 __del__。 我的例子: class MyClas
我使用 __del__() 编写警告日志,以防对象在错误的内部状态下被删除(请不要为此生气)。 我尝试对其进行测试,但尽管我在测试中使用了 del my_object,但似乎并未调用 __del__(
今天早些时候我问了this关于使用导入模块的对象的 __del__() 方法的问题。问题是 __del__() 想要使用模块 os,但有时(并非总是)该模块已被删除。有人告诉我,当 Python 程序
__del__ 方法在引用计数达到零后多久被调用?该语言是否保证在任何其他使用代码可以执行之前立即完成?或者每个实现都可以做它喜欢的事情,可能会延迟对 __del__ 任意长的调用? 请忽略程序即将退
我了解到 python does not guarantee每当删除一个对象时调用 __del__。换句话说,del x不一定调用它的析构函数x.__del__()。 如果我想确保正确的对象清理,我应
假设有一个程序在运行时有几个对象存在于其中。 程序结束时是否调用了每个对象的__del__方法? 如果是,我可以做这样的事情: class Client: __del__( self ):
我读了an example in David Beazley's Python Essential Reference : class Account(object): def __init_
我主要用 C++ 做事,其中析构函数方法实际上是为了销毁已获取的资源。最近我开始使用 python(这真的很有趣而且很棒),我开始学习它像 java 一样具有 GC。因此,没有过分强调对象所有权(构造
Python 3 中编写自定义 __del__ 方法或依赖 stdlib1 方法的用例有哪些?也就是说,在什么情况下它是相当安全的,并且可以做一些没有它很难做的事情? 出于许多充分的理由 ( 1 2
monkeypatch是 pytest 中的一个很棒的工具,允许您替换当前测试范围内的任何函数。最棒的事情之一是甚至可以修补构造函数。然而不幸的是,我在修补析构函数时遇到了麻烦。它似乎只有在测试成功时
我正在使用单例对象来管理数据库连接。我正在运行一系列依赖于该对象的测试。另外,我也必须测试该对象,因此我必须删除它并检查它的 __del__ 方法是否正确执行。 当我测试它时,因为我删除了单例,所以其
我为日志记录模块编写了一个包装类,它具有 __del__ 方法来在程序末尾删除日志文件。 我的程序将此日志文件从其他类复制到存档中,并且在下一个程序执行之前工作文件夹中没有日志文件很重要。但我无法从其
我正在编写一个 Lua 包装器,最高级别的抽象在其 __del__ 方法中调用 lua_close 。据我所知,除了 setuptools 测试之外,每个测试都通过了(即常规单元测试有效,而使用 se
这个问题已经有答案了: What is the __del__ method and how do I call it? (5 个回答) 已关闭 6 年前。 我想在字典中注册我的类上的每个实例,键是参
这个虚拟类与我当前的项目类似: class EndProcess(object): def __init__(self): self._Q = multiprocessing.
是否有一种简单的方法可以打印 __del__ 中发生的异常的堆栈跟踪?就我而言,没有为此对象定义 __del__ 方法 Exception TypeError: "'NoneType' object
我是一名优秀的程序员,十分优秀!