【发布时间】: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