如何取消导入已导入的python模块?

时间:2015-08-26 18:33:32

标签: python python-import

我对NumPy / SciPy很新。但是现在,我已经开始非常积极地使用它进行数值计算,而不是使用Matlab。

对于一些简单的计算,我只是在交互模式而不是编写脚本。在这种情况下,是否有任何方法可以不导入已导入的某些模块?我编写python程序时可能不需要重新导入,但在交互模式下,需要它。

4 个答案:

答案 0 :(得分:59)

一旦您导入了某些内容,就无法卸载。 Python会在缓存中保留模块的副本,因此下次导入时,它不会再次重新加载并重新初始化。

如果你只需要失去对它的访问权限,你可以使用del

import package
del package

如果您对某个软件包进行了更改并希望查看更新,则可以reload。请注意,在某些情况下,这不会起作用,例如,如果导入的包还需要重新加载它所依赖的包。在依赖此文档之前,您应该阅读相关文档。

对于最高2.7的Python版本,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)

答案 1 :(得分:13)

虽然你不应该担心"不提供"在Python中的模块,您通常可以使用import简单地减少对del ed模块或函数的引用:

>>> 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 *)。

答案 2 :(得分:2)

导入模块时,Python会检查该模块是否在sys.modules词典中。如果没有,它将运行模块,并将生成的模块对象放入sys.modules

因此,要取消导入模块,可以使用

import sys
sys.modules.pop('your_module_name_here')

下次导入时,python将重新执行该模块。但是,在所有其他已导入模块的已加载模块中,仍将使用旧代码,因为它们仍保留对旧模块对象的引用。其他答案中介绍的reload函数通过更新模块对象而不是创建全新的对象来帮助解决这种情况。但这对from your_module import some_function导入样式没有帮助。

答案 3 :(得分:0)

我的建议是您必须找到与该模块相关的所有/子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]