在 Python 3.x 中卸载模块(与重新加载不同)[重复]
Posted
技术标签:
【中文标题】在 Python 3.x 中卸载模块(与重新加载不同)[重复]【英文标题】:Unloading a module in Python 3.x (not the same as re-loading) [duplicate] 【发布时间】:2014-03-05 00:01:54 【问题描述】:我很清楚,Python 2 中没有干净的解决方案来卸载模块,这是一个已知的错误,已设置为进行更正。
帖子:
How do I unload (reload) a Python module? Remove an imported python module
2009 年和 2010 年证实了缺乏对卸载模块的支持。
我想知道这是否已在 Python 3.x 中解决。当我这样做时,import os
,del os
,dir()
,os
模块不存在(至少不可见,可用)。没了?
【问题讨论】:
import os; del os; assert 'os' not in dir()
也适用于 Python 2。
检查sys.modules
,而不是dir
。
@poke。我已经链接到该页面。我在问它是否仍然是最新的。那里的答案与 Python 2.x 有关,我询问了 Python 3.x。
@poke 这是糟糕的设计,你错了:完全卸载纯 Python 模块是trivial。例如,完全卸载***模块foo
会减少到del sys.modules['foo']; del foo
。 就是这样。 完全卸载子模块稍微复杂一些,但不是真的。然而,完全卸载 C 扩展似乎是不可行的。
这不是重复的...... importlib 没有“卸载”功能
【参考方案1】:
sys.modules
仍然持有对该模块的引用。
>>> import six
>>> del six
>>> sys.modules["six"]
<module 'six' from '/usr/lib64/python3.3/site-packages/six.py'>
sys.modules 仍然拥有引用。所以我认为你也不能在 Python 3.3 中卸载模块。
【讨论】:
你可以 unload modules,但你甚至没有真正尝试过。由于six
是***纯 Python 模块,卸载 six
会减少到 (A) del sys.modules['six']
和 (B) del six
(在任一命令)。而已。删除对该模块的所有引用会导致该模块被垃圾回收。以上是关于在 Python 3.x 中卸载模块(与重新加载不同)[重复]的主要内容,如果未能解决你的问题,请参考以下文章