在 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 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 没有“卸载”功能 【参考方案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 中卸载模块(与重新加载不同)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

脚本编译后如何在python中重新加载模块?

为啥你永远不应该重新加载模块? [复制]

Python之reload函数

第 8 章: 模块, 包与分发---PDF版

python如何重新加载模块

如何在 Python 中使用 ctypes 卸载 DLL?