我对NumPy / SciPy很新。但是现在,我已经开始非常积极地使用它进行数值计算,而不是使用Matlab。
对于一些简单的计算,我只是在交互模式而不是编写脚本。在这种情况下,是否有任何方法可以不导入已导入的某些模块?我编写python程序时可能不需要重新导入,但在交互模式下,需要它。
答案 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]