python教程—卸载Python中的模块-Python实用宝典

python教程—卸载Python中的模块

TL /博士:更新 关于这个问题,我已经与Python开发人员联系过了,实际上,“在未来5年内”不可能完全卸载一个模块。(见链接)

TL /博士:

    import gc, sys print len(gc.get_objects()) # 4073 objects in memory # Attempt to unload the module import httplib del sys.modules["httplib"] httplib = None gc.collect() print len(gc.get_objects()) # 6745 objects in memory

< b > < / b >更新
关于这个问题,我已经和Python开发人员联系过,事实上,在“未来五年内”,不可能完全卸载模块。(见链接)

请接受Python确实不支持卸载模块来解决2.x中严重的、基本的、无法克服的技术问题。


在我最近在我的应用程序中寻找memleak时,我将其缩小到模块,即我无法<强>垃圾收集> /强>卸载模块。使用下面列出的任何方法卸载模块都会在内存中留下数千个对象。换句话说,我无法卸载Python中的模块…

问题的其余部分是尝试以某种方式对模块进行垃圾收集。

让我们试一试:

    import gc import sys sm = sys.modules.copy() # httplib, which we'll try to unload isn't yet # in sys.modules, so, this isn't the source of problem print len(gc.get_objects()) # 4074 objects in memory

让我们保存一个sys的副本。模块稍后尝试还原它。
这是基线4074个对象。我们应该以某种方式回到理想状态。

让我们导入一个模块:

    import httplib print len(gc.get_objects()) # 7063 objects in memory

我们最多有7K个非垃圾对象。
让我们尝试从sys.modules中删除httplib。

    sys.modules.pop('httplib') gc.collect() print len(gc.get_objects()) # 7063 objects in memory

但那没用。嗯,但是在……main__中没有引用吗?哦,是的。

    del httplib gc.collect() print len(gc.get_objects()) # 6746 objects in memory

万岁,掉了300个物体。尽管如此,没有雪茄,这已经远远超过4000件原始物品了。
让我们试着恢复sys。从复制模块。

    sys.modules = sm gc.collect() print len(gc.get_objects()) # 6746 objects in memory

嗯,那是没有意义的,没有改变…
也许如果我们消灭地球人…

    globals().clear() import gc # we need this since gc was in globals() too gc.collect() print len(gc.get_objects()) # 6746 objects in memory

当地人吗?

    locals().clear() import gc # we need this since gc was in globals() too gc.collect() print len(gc.get_objects()) # 6746 objects in memory

什么. .如果我们在exec中导入一个模块呢?

    local_dict = {} exec 'import httplib' in local_dict del local_dict gc.collect() print len(gc.get_objects()) # back to 7063 objects in memory

这不公平,它将其导入到……main__中,为什么?它不应该离开local_dict…啊!我们回到完全导入的httplib。
也许我们可以用一个虚拟物体来代替它?

    from types import ModuleType import sys print len(gc.get_objects()) # 7064 objects in memory

血腥..... ! !

    sys.modules['httplib'] = ModuleType('httplib') print len(gc.get_objects()) # 7066 objects in memory

死模块,死! !

    import httplib for attr in dir(httplib): setattr(httplib, attr, None) gc.collect() print len(gc.get_objects()) # 6749 objects in memory

好吧,在所有的尝试之后,最好是从+2675(接近+50%)开始…这只是从一个模块…里面甚至没有什么大东西……

好了,说真的,我的错误在哪里?
我如何卸载一个模块并删除它的所有内容?
或者Python的模块是一个巨大的内存泄漏?

完整的源代码,以更简单的复制形式:http://gist.github.com/450606

回答

Python不支持卸载模块。

但是,除非您的程序在一段时间内加载无限数量的模块,否则这不是内存泄漏的根源。模块通常在启动时加载一次,仅此而已。您的内存泄漏很可能发生在其他地方。

在不太可能的情况下,您的程序确实在一段时间内加载了无限数量的模块,您可能应该重新设计您的程序。:-)

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论