如何取消导入已经导入的 Python 模块?
- 2025-03-19 08:57:00
- admin 原创
- 54
问题描述:
我对 NumPy/SciPy 还不太熟悉。但最近,我开始积极地使用它进行数值计算,而不是使用 Matlab。
对于一些简单的计算,我只在交互模式下进行,而不是编写脚本。 在这种情况下,有什么方法可以取消导入一些已经导入的模块? 当我编写 python 程序时可能不需要取消导入,但在交互模式下,这是必要的。
解决方案 1:
一旦导入了某个模块,就无法卸载它。Python 会在缓存中保存模块的副本,因此下次导入时无需重新加载并重新初始化它。
如果您需要的是失去对它的访问权限,您可以使用del
:
import package
del package
请注意,如果您随后重新导入该包,则将使用该模块的缓存副本。
如果您想使模块的缓存副本无效,以便在重新导入时重新运行代码,则可以sys.modules.pop
按照@DeepSOIC 的回答使用。
如果您对某个包进行了更改并且想要查看更新,您可以reload
这样做。请注意,在某些情况下,这不起作用,例如,如果导入的包还需要重新加载它所依赖的包。在依赖此包之前,您应该阅读相关文档。
对于 Python 2.7 及以下版本,reload
有一个内置函数:
reload(package)
对于 Python 版本 3.0 至 3.3,您可以使用imp.reload
:
import imp
imp.reload(package)
对于 Python 3.4 及更高版本,您可以使用importlib.reload
:
import importlib
importlib.reload(package)
解决方案 2:
当你导入一个模块时,Python 会查找该模块是否在sys.modules
字典中。如果不在,它会运行该模块,并将生成的模块对象放入sys.modules
。
因此,要取消导入模块,可以使用
import sys
sys.modules.pop('your_module_name_here')
下次导入时,Python 将重新执行该模块。但是,在已导入该模块的所有其他已加载模块中,仍将使用旧代码,因为它们仍保留对旧模块对象的引用。reload
其他答案中解释的函数通过更新模块对象而不是创建全新的模块对象来帮助解决这种情况。但它对导入的样式没有帮助from your_module import some_function
。
解决方案 3:
虽然您不必担心在 Python 中“取消导入”模块,但通常只需import
使用以下命令简单地减少对 ed 模块或函数的引用del
:
>>> import requests
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'readline', 'requests', 'rlcompleter']
>>> del requests
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'readline', 'rlcompleter']
>>>
请注意,我建议不要担心这个问题,因为未使用的导入的开销几乎微不足道——sys.modules
与虚假安全性del some_module
给您带来的相比,遍历一个额外的条目根本不算什么(考虑是否__init__
进行了一些设置或者您运行了from X import *
)。
解决方案 4:
我的建议是您必须找到import
与该模块相关的所有内容/子内容才能成功删除它们。
package_name = your_package_name
loaded_package_modules = [key for key, value in sys.modules.items() if package_name in str(value)]
for key in loaded_package_modules:
print(key)
del sys.modules[key]
扫码咨询,免费领取项目管理大礼包!