【问题标题】:Unloading a module in Python 3.x (not the same as re-loading) [duplicate]在 Python 3.x 中卸载模块(与重新加载不同)[重复]
【发布时间】:2026-02-09 03:40:01
【问题描述】:

我很清楚,Python 2 中没有干净的解决方案来卸载模块,这是一个已知的错误,已设置为进行更正。

帖子:

How do I unload (reload) a Python module? Remove an imported python module

2009 年和 2010 年证实了缺乏对卸载模块的支持。

我想知道这是否已在 Python 3.x 中解决。当我这样做时,import osdel osdir()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 没有“卸载”功能

标签: python python-3.x


【解决方案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(在任一命令)。而已。删除对该模块的所有引用会导致该模块被垃圾回收。