我对NumPy / SciPy相当新。但是这些天,我已经开始积极使用它来进行数值计算,而不是使用Matlab。
对于一些简单的计算,我只是在交互模式下进行而不写脚本。在这种情况下,是否有任何方法可以取消导入已经导入的一些模块?在编写Python程序时可能不需要取消导入,但在交互模式下,则需要取消导入。
我对NumPy / SciPy相当新。但是这些天,我已经开始积极使用它来进行数值计算,而不是使用Matlab。
对于一些简单的计算,我只是在交互模式下进行而不写脚本。在这种情况下,是否有任何方法可以取消导入已经导入的一些模块?在编写Python程序时可能不需要取消导入,但在交互模式下,则需要取消导入。
如果你导入了某个东西,就没有办法再卸载它。Python会在缓存中保留这个模块的副本,所以下一次导入它时,就不需要重新加载和初始化了。
如果你只想失去访问权限,可以使用del
:
import package
del package
注意,如果您重新导入该包,则将使用模块的缓存副本。
如果您想使模块的缓存副本无效,以便在重新导入时重新运行代码,可以使用 sys.modules.pop
,如@DeepSOIC's answer 中所述。
如果您对软件包进行了更改并希望查看更新内容,则可以使用 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)
import numpy as np
,然后又执行了 np.pi = 2
。那么我该如何在 Python 中将其重置为 n.pi = 3.14 ..
的状态或者还没有导入 numpy
的状态呢?简而言之,是否可以完全撤销导入操作而无需重新加载 Python 或控制台? - MadPhysicistreload
重新初始化模块的整个内容,撤销您对其所做的任何更改。 您试过了吗? - Mark Ransomsys.modules
字典中是否存在该模块。如果不存在,则运行该模块,并将生成的模块对象放入sys.modules
中。import sys
sys.modules.pop('your_module_name_here')
reload
函数可以通过更新模块对象而不是创建全新的模块对象来解决这种情况。但是它无法帮助from your_module import some_function
类型的导入。虽然在Python中你不必担心“取消导入”一个模块,但通常你可以使用del
来简单地减少对已经import
的模块或函数的引用:
>>> 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 *
)。我的建议是,你需要找到所有与该模块相关的/子级别的 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]
del sys.modules['foo']
的解决方案,但需要注意一些限制。 - Robert Fleming