重新加载模块,给出NameError:名称'reload'未定义


162

我正在尝试重新加载已经在Python 3中导入的模块。我知道您只需要导入一次,import再次执行命令将不会执行任何操作。

执行reload(foo)中出现此错误:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

错误是什么意思?

Answers:


239

reload 是Python 2中的内置函数,而不是Python 3中的内置函数,因此,您所看到的错误是预期的。

如果您确实必须在Python 3中重新加载模块,则应使用以下任一方法:


37
这个答案听起来像在Python 3中重新加载模块是不好的。这背后的想法是什么?
ABM

11
重新加载总是有问题的。重新加载会更新模块变量,但不会删除旧变量,因此,如果重命名,旧名称将仍然存在。如果更改类定义,则现有对象仍将具有旧类型。最后,某些模块在导入时运行的代码并非旨在运行两次。因此最好避免重装,但通常非常方便。
埃文

13
我会说这经常是有问题的,但并非总是如此。可以肯定的是,我认为编写reload脚本的有效用例确实非常罕见,而采用这种深色技术的人不太可能读到此注释。但是,如果您正在开发模块并使用IPython控制台进行交互式测试,那么reload在该工作流程中会很方便。但是,正如@Evan所说,要注意导入时的副作用。通常,我会说避免使用reload其他人的模块。 reload在设计时自行设计是很有意义的。
Tim D

6
我使用Jupyter笔记本进行工作,并且为了使工作保持整洁,我将应该对最低要求进行修订的工作放入了可导入的程序包中。但是,这些事情有时需要修改,并且重新加载绝对是正确的事情,因为我的笔记本内核保持着内存计算,而这些计算实际上要花整整一天的时间。
斯科特,

重新加载对于积极开发具有耗时调用(例如数据库功能)的库至关重要。但是,在重新加载模块中可能遇到的主要问题之一是带有装饰器的函数往往无法正确地重新加载,请参见此处
Alexander McFarlane19年

82

对于> = Python3.4:

import importlib
importlib.reload(module)

对于<= Python3.3:

import imp
imp.reload(module)

对于Python2.x:

使用内置reload()功能。

reload(module)

48
import imp
imp.reload(script4)

7
从Python 3.4开始不推荐使用- importlib代替。
Mark Amery

39

要扩展先前编写的答案,如果您想要一个可以在Python版本2和版本3中使用的解决方案,则可以使用以下方法:

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3

12

我建议使用以下代码段,因为它可在所有python版本中使用(需要six):

from six.moves import reload_module
reload_module(module)

2

为了实现python2和python3的兼容性,可以使用:

# Python 2 and 3
from imp import reload
reload(mymodule)

1
这在Python 3.7(及更早版本)中可用,但由于@Alex Martelli在下面的描述而被贬低。使用Alleo的答案“ from six.moves import reload_module”
Charles Plager

2

如果您不想使用外部库,则一种解决方案是从python 2重新为python 3创建reload方法,如下所示。在模块顶部使用它(假设python 3.4+)。

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

如果您将python文件用作配置文件,并希望避免重新启动应用程序,则非常需要BTW重新加载。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.