重新加载模块,如果 NameError: name‘ reload’没有定义

我试图重新加载一个已经在 Python3中导入的模块。我知道您只需要导入一次,再次执行 import命令将无济于事。

执行 reload(foo)会出现这样的错误:

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

这个错误是什么意思?

174603 次浏览

reload 是 Python 2内置的,但不是 Python 3内置的,所以您看到的错误是预料之中的。

如果您真的必须在 Python3中重新加载模块,那么您应该使用以下两种方式:

import imp
imp.reload(script4)

对于 > = Python 3.4:

import importlib
importlib.reload(module)

因为 < = Python 3.3:

import imp
imp.reload(module)

对于 Python 2.x:

使用内置的 reload()函数。

reload(module)

为了扩展以前写的答案,如果你想要一个单一的解决方案,将工作在 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

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

from six.moves import reload_module
reload_module(module)

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

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

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

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

如果您使用 python 文件作为配置文件,并且希望避免重新启动应用程序,那么 BTW 重新加载是非常必要的... ..。