python - 在Python中,如何卸载生成的类

标签 python dynamic garbage-collection classloader

我正在开发一个将文件(hfd5 - pytables)加载到对象结构中的库。用于该结构的实际类作为字符串从 hdf5 文件加载,然后 以这种方式加载:

class NamespaceHolder(dict):
    # stmt is the source code holding all the class defs
    def execute(self, stmt):
        exec stmt in self

问题是,像这样加载多个类会导致对象出现在垃圾回收的不可回收部分,即实际的类定义中。我也可以将其加载到全局字典中,但问题仍然是孤立类。有没有办法卸载类?

主要问题是 class.mro 属性,它包含返回到类本身的引用,导致垃圾收集器无法处理的循环引用。

这是一个小测试用例,您可以自行查看:

import gc

if __name__ == "__main__":
    gc.enable()
    gc.set_debug(gc.DEBUG_LEAK)

    code = """
class DummyA(object):
    pass
"""
    context = {}

    exec code in context
    exec code in context

    gc.collect()
    print len(gc.garbage)

请注意:我已经反对使用解析文件中的文本来创建类,但显然他们打算在这里使用它并看到一些我没有看到的好处,所以放弃这个解决方案并不是'现在可行。

最佳答案

gc.set_debug(gc.DEBUG_LEAK) 导致泄漏。试试这个:

import gc

def foo():                              
    code = """
class DummyA(object):
    pass             
"""
    context = {}
    exec code in context
    exec code in context

    gc.collect()
    print len(gc.garbage), len(gc.get_objects())

gc.enable()
foo(); foo() # amount of objects doesn't increase
gc.set_debug(gc.DEBUG_LEAK)
foo() # leaks

关于python - 在Python中,如何卸载生成的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/919924/

相关文章:

arrays - 查找绳子中可见衣服的数量

c# - 为什么C#/xna中的垃圾回收不会自动处理渲染目标?

python - 在Python中使用概率

javascript - 使用 Jquery 动态检查单选按钮是否被选中

Python 文本小部件仅在窗口中打开

python - 使用 python 在 blender 中使用 addObject()

java - 符合垃圾收集条件的对象

java - 如何以及何时使用 Mockito Annotations 和 jUnit 进行清理

python - 在 Google App Engine 中将二进制文件转换为 PIL Image 数据类型

python - sqlalchemy.exc.OperationalError : (sqlite3. OperationalError) 未知数据库 "mydb"