没有定义给出NameError:name'reload'的重新加载模块

Lon*_*ice 154 python python-3.x

我正在尝试重新加载我已经在Python 3中导入的模块.我知道你只需要导入一次并import再次执行命令就不会做任何事情.

执行reload(foo)是给出这个错误:

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

错误是什么意思?

Ale*_*lli 231

reload 是Python 2内置的,但在Python 3中没有,因此您所看到的错误是预期的.

如果你真的必须在Python 3中重新加载一个模块,你应该使用:

  • 这个答案让人觉得在Python 3中重新加载模块是不好的.这背后的想法是什么? (34认同)
  • 我会说这是_often_有问题,但不是_always_.可以肯定的是,我认为将"重载"写入脚本的有效用例确实非常罕见,那些采用这种黑暗艺术的人不太可能阅读这篇评论.但是,如果您正在开发模块并使用IPython控制台以交互方式对其进行测试,那么`reload`在该工作流程中可以很方便.正如@Evan所说,注意进口时间的副作用.一般来说,我会说避免"重新加载"其他人的模块.在设计时,重新加载自己是有意义的. (12认同)
  • 重装总是有问题的。重新加载更新模块变量,但不会删除旧变量,因此如果您重命名某些内容,旧名称仍将存在。如果更改类定义,现有对象仍将具有旧类型。最后,某些模块在导入时运行的代码并非设计为运行两次。所以最好避免重新加载,但频繁加载很方便。 (9认同)
  • 我使用Jupyter笔记本进行工作,为了保持整洁,我将需要最少修订的工作放入可导入的包中.然而,这些东西有时需要修改,重新加载绝对是正确的事情,因为我的笔记本内核正在进行内存计算,实际上是整天计算. (6认同)

Kev*_*vin 81

对于> = Python3.4:

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

对于<= Python3.3:

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

对于Python2.x:

使用内置reload()功能.

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


小智 48

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

  • 自Python 3.4以来不推荐使用 - 改为使用`importlib`. (7认同)

Joe*_*elm 36

要扩展以前编写的答案,如果您想要一个适用于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
Run Code Online (Sandbox Code Playgroud)


All*_*leo 11

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

from six.moves import reload_module
reload_module(module)
Run Code Online (Sandbox Code Playgroud)


Pat*_*ira 5

对于 python2 和 python3 兼容性,您可以使用:

# Python 2 and 3
from imp import reload
reload(mymodule)
Run Code Online (Sandbox Code Playgroud)