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

cha*_*com 48 python python-import

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

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

Mar*_*som 79

一旦导入它就无法卸载.Python会在缓存中保留模块的副本,因此下次导入模块时,不必重新加载并重新初始化它.

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

import package
del package
Run Code Online (Sandbox Code Playgroud)

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

对于高达2.7的Python版本,reload是一个内置函数:

reload(package)
Run Code Online (Sandbox Code Playgroud)

对于Python版本3.0到3.3,您可以使用imp.reload:

import imp
imp.reload(package)
Run Code Online (Sandbox Code Playgroud)

对于Python 3.4及更高版本,您可以使用importlib.reload:

import importlib
importlib.reload(package)
Run Code Online (Sandbox Code Playgroud)

  • 在python 3中,重新加载`imp`,所以它是`import imp; imp.reload(包)` (9认同)

小智 16

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

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

import sys
sys.modules.pop('your_module_name_here')
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这是比“del”更好的答案,因为它使导入缓存无效,这正是我在这些类型的情况下几乎总是想要的...... (5认同)

小智 13

虽然您不必担心Python中的"不重要"模块,但通常只需使用以下命令减少对imported模块或函数的引用del:

>>> import requests
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'readline', 'requests', 'rlcompleter']
>>> del requests
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'readline', 'rlcompleter']
>>>
Run Code Online (Sandbox Code Playgroud)

请注意,我建议不要担心这一点,因为未使用的导入的开销几乎是微不足道的 - 遍历一个额外的条目sys.modules是没有什么比假安全性del some_module会给你(考虑是否__init__ 做了一些设置或你运行from X import *).


dtl*_*m26 6

我的建议是,您必须找到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]
Run Code Online (Sandbox Code Playgroud)