Python 重新加载给定名称的模块错误:name';重新加载';没有定义
我正在尝试重新加载一个已经在Python3中导入的模块。我知道您只需要导入一次,再次执行Python 重新加载给定名称的模块错误:name';重新加载';没有定义,python,python-3.x,Python,Python 3.x,我正在尝试重新加载一个已经在Python3中导入的模块。我知道您只需要导入一次,再次执行import命令将不会产生任何效果 执行reload(foo)会产生以下错误: Traceback (most recent call last): File "(stdin)", line 1, in (module) ... NameError: name 'reload' is not defined 这个错误是什么意思?是Python 2中的内置代码,但不是Python 3中的内置代
import
命令将不会产生任何效果
执行reload(foo)
会产生以下错误:
Traceback (most recent call last):
File "(stdin)", line 1, in (module)
...
NameError: name 'reload' is not defined
这个错误是什么意思?是Python 2中的内置代码,但不是Python 3中的内置代码,因此您看到的错误是预期的
如果确实必须在Python 3中重新加载模块,则应使用以下任一方法:
- 对于Python 3.4及更高版本
- 对于Python3.0到3.3(自Python3.4以来已弃用,以支持) 对于>=Python3.4:
对于要扩展前面的书面答案,如果您想要一个能够跨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导入重新加载模块
重新加载模块(模块)
对于python2和python3的兼容性,您可以使用:
# Python 2 and 3
from imp import reload
reload(mymodule)
如果您不想使用外部libs,那么一个解决方案是从Python2为Python3重新创建reload方法,如下所示。在模块顶部使用此选项(假定为python 3.4+)
顺便说一句,如果您使用python文件作为配置文件,并且希望避免重新启动应用程序,则非常需要重新加载。由于python 3.4,已弃用了,请改用
importlib
。这个答案听起来好像在python 3中重新加载模块不好。这背后的想法是什么?重新加载总是有问题的。重新加载会更新模块变量,但不会删除旧变量,因此,如果重命名某个对象,旧名称仍将存在。如果更改类定义,现有对象仍将具有旧类型。最后,有些模块在导入时运行代码,而不是设计为运行两次。因此,最好避免重新加载,但通常非常方便。我想说,这通常是有问题的,但并不总是如此。平心而论,我认为将reload
写入脚本的有效用例确实非常罕见,而那些采用这种黑暗艺术的人不太可能阅读这篇评论。但是,如果您正在开发一个模块并使用IPython控制台以交互方式对其进行测试,那么重新加载
在该工作流程中非常方便。正如@Evan所说,不过,要注意导入时间的副作用。一般来说,我会说避免重新加载别人的模块<代码>重新加载在设计期间,自行加载是有意义的。我使用Jupyter笔记本进行工作,为了保持整洁,我将需要最少修改的工作放入可导入的包中。然而,这些东西有时需要修改,重新加载绝对是正确的做法,因为我的笔记本内核在内存中进行计算,实际上需要一整天的时间来计算。重新加载对于具有耗时调用(例如数据库函数)的库的积极开发至关重要。但是,在重新加载模块时可能遇到的一个主要问题是,带有装饰器的函数往往无法正确地重新加载。请参见Python 3.7(及更早版本)中的这一点,但正如@Alex Martelli在下面所写的那样,这一点已被消除。使用Alleo的答案“from six.moves import reload_module”,在我运行例如imp.reload(plt)
或imp.reload(plt)
的情况下,上述两个模块可以工作,但如果我运行imp.reload(script)
,则不会。通过import matplotlib.pyplot as plt将plt设置为matplotlib.pyplot。你知道为什么当我尝试重新加载我自己编写并以前导入的脚本时,它无法工作吗?出现以下错误
ModuleNotFoundError:找不到模块脚本的规范`
import imp
imp.reload(module)
reload(module)
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 2 and 3
from imp import reload
reload(mymodule)
import sys
if(sys.version_info.major>=3):
def reload(MODULE):
import importlib
importlib.reload(MODULE)