提问人:Stefano Borini 提问时间:8/10/2009 最后编辑:Mateen UlhaqStefano Borini 更新时间:7/15/2022 访问量:306608
在交互时重新导入模块
Reimport a module while interactive
答:
对于 Python 3.4+:
import importlib
importlib.reload(nameOfModule)
对于 Python < 3.4:
reload(my.module)
来自 Python 文档
重新加载以前导入的模块。该参数必须是模块对象,因此之前必须已成功导入。如果您使用外部编辑器编辑了模块源文件,并希望在不离开 Python 解释器的情况下试用新版本,这将非常有用。
不要忘记使用此方法的注意事项:
重新加载模块时,将保留其字典(包含模块的全局变量)。名称的重新定义将覆盖旧定义,因此这通常不是问题,但如果模块的新版本未定义旧版本定义的名称,则不会删除旧定义。
如果一个模块使用 从另一个模块导入对象,则调用另一个模块不会重新定义从它导入的对象 - 一种方法是重新执行语句,另一种方法是使用 和限定名 ()。
from ... import ...
reload()
from
import
module.*name*
如果模块实例化了类的实例,则重新加载定义该类的模块不会影响实例的方法定义 - 它们继续使用旧的类定义。派生类也是如此。
评论
from filename import *
import foo; from foo import bar; reload(foo)
在 python 3 中,不再是内置函数。reload
如果您使用的是 python 3.4+,则应改用 importlib
库中的 reload
:
import importlib
importlib.reload(some_module)
如果您使用的是 python 3.2 或 3.3,您应该:
import imp
imp.reload(module)
相反。查看 http://docs.python.org/3.0/library/imp.html#imp.reload
如果您使用的是 ipython
,请务必考虑使用 autoreload
扩展:
%load_ext autoreload
%autoreload 2
评论
from mymodule import myfunc
importlib.reload(myfunc)
importlib.reload(mymodule.myfunc)
importlib.reload(mymodule)
实际上,在 Python 3 中,该模块被标记为 DEPRECATED。好吧,至少 3.4 是这样。imp
相反,应使用模块中的函数:reload
importlib
https://docs.python.org/3/library/importlib.html#importlib.reload
但请注意,该库在最后两个次要版本中进行了一些 API 更改。
尽管提供的答案确实适用于特定模块,但它们不会重新加载子模块,如以下答案中所述:
如果一个模块使用 从另一个模块导入对象,则调用另一个模块不会重新定义从它导入的对象 - 一种方法是重新执行 from 语句,另一种方法是改用 and 限定名称 ()。
from ... import ...
reload()
import
module.*name*
但是,如果使用变量来定义公共 API,则可以自动重新加载所有公开可用的模块:__all__
# Python >= 3.5
import importlib
import types
def walk_reload(module: types.ModuleType) -> None:
if hasattr(module, "__all__"):
for submodule_name in module.__all__:
walk_reload(getattr(module, submodule_name))
importlib.reload(module)
walk_reload(my_module)
不过,上一个答案中提到的警告仍然有效。值得注意的是,修改不属于公共 API 的子模块(如变量所述)不会受到使用此函数重新加载的影响。同样,删除子模块的元素也不会反映在重新加载中。__all__
如果要从模块导入特定函数或类,可以执行以下操作:
import importlib
import sys
importlib.reload(sys.modules['my_module'])
from my_module import my_function
评论
另一个小点:如果你使用了语法,那么你必须用它的别名重新加载模块(在这个例子中):import some_module as sm
sm
>>> import some_module as sm
...
>>> import importlib
>>> importlib.reload(some_module) # raises "NameError: name 'some_module' is not defined"
>>> importlib.reload(sm) # works
评论
import <module> as <name>
<name>
reload()
reload()
import sys
del sys.modules['module_name']
import module_name
评论
上一个:不存在的日期上的重复日期
评论