Python 重新加载给定名称的模块错误:name';重新加载';没有定义

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中的内置代

我正在尝试重新加载一个已经在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中的内置代码,因此您看到的错误是预期的

如果确实必须在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)