【问题标题】:Suppress warnings from Python module's destructor order禁止来自 Python 模块的析构函数顺序的警告
【发布时间】:2018-09-12 04:21:11
【问题描述】:

在使用 libvirt 时,我在 Python 2.7 脚本的解释器关闭期间收到一系列警告。这可以在各种发行版上重现,包括 Fedora 27 上的 python2-libvirt 3.7.0-1 到 Centos 7.4.1708 上的 libvirt-python 3.2.0-1。脚本退出时我收到的警告是:

Exception AttributeError: "'NoneType' object has no attribute 'virDomainFree'" in <bound method virDomain.__del__ of <libvirt.virDomain object at 0x7f34a194ee10>> ignored
Exception AttributeError: "'NoneType' object has no attribute 'virDomainFree'" in <bound method virDomain.__del__ of <libvirt.virDomain object at 0x7f34a194ed90>> ignored
Exception AttributeError: "'NoneType' object has no attribute 'virConnectClose'" in <bound method virConnect.__del__ of <libvirt.virConnect object at 0x7f34a176a590>> ignored

深入到库中,在 libvirt.py 中的这段代码中,按析构函数顺序进行假设似乎是一个问题:

class virDomain(object):
    def __del__(self):
        if self._o is not None:
            libvirtmod.virDomainFree(self._o)
        self._o = None

libvirtmod 是由 libvirt.py 模块顶部的导入创建的全局变量。当 virDomain__del__() 析构函数最终运行时,libvirtmod 已被值 None 替换,导致上面的代码失败并出现警告。我们使用这个 Python 模块已经有一段时间了,但直到最近我们对代码进行了相当大的重构后,这些警告才开始出现。我该怎么做才能从标准错误中抑制这些警告或避免这种情况发生?有没有办法确保在 libvirtmod.so 消失之前清理 libvirt.py 中的对象?

我们在各种发行版上进行测试,并希望坚持使用发行版随附的库存(但已更新)软件包。

【问题讨论】:

    标签: python python-2.7 destructor python-2.x libvirt


    【解决方案1】:

    标准技巧是为__del__ 配备默认参数,这些参数包含它需要的任何全局值(这里,libvirtmod 本身就足够了)。有一个variation using weakref,它也可以从默认参数中受益。

    【讨论】:

    • 使用默认参数进行测试,但在某些情况下似乎 libvirtmod 在 libvirt 之前被卸载。理想情况下,我想找到一个不需要我修补通过发行版的包管理安装的其他人的库的解决方案,但我可能只是在处理一个有问题的库。
    • @penguin359:抱歉——我认为您实际上需要捕获libvirtmod member(s),而不仅仅是模块。你可以试试,如果可行,我会编辑答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多