【问题标题】:Reloading module giving NameError: name 'reload' is not defined重新加载模块给出 NameError: name 'reload' is not defined
【发布时间】:2010-10-31 23:05:34
【问题描述】:

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

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

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

错误是什么意思?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

    如果您确实必须在 Python 3 中重新加载模块,您应该使用:

    【讨论】:

    • 这个答案听起来好像在 Python 3 中重新加载模块很糟糕。这背后的想法是什么?
    • 重新加载总是有问题的。重新加载会更新模块变量,但不会删除旧的,所以如果你重命名一些东西,旧的名字仍然存在。如果您更改类定义,现有对象仍将具有旧类型。最后,一些模块在导入时运行的代码并非设计为运行两次。所以最好避免重新加载,但经常非常方便。
    • 我会说它经常有问题,但并非总是。可以肯定的是,我认为将reload 写入脚本的有效用例确实非常很少见,那些采用这种黑暗艺术的人不太可能阅读此评论。但是,如果您正在开发一个模块并使用 IPython 控制台以交互方式对其进行测试,那么reload 在该工作流程中会很方便。不过,正如@Evan 所说,请注意导入时的副作用。一般来说,我会说避免reloading 别人的模块。 reload自己在设计时是有意义的。
    • 我在工作中使用 Jupyter notebook,为了保持整洁,我将需要最少修改的工作放入可导入的包中。然而,这些东西有时需要修改,重新加载绝对是正确的做法,因为我的笔记本内核保存在内存中的计算,从字面上看,需要一整天的时间来计算。
    • 重新加载对于调用耗时的库的积极开发至关重要,例如数据库功能。但是,您在重新加载模块时可能遇到的主要问题之一是带有装饰器的函数往往无法正确重新加载,请参阅here
    【解决方案2】:

    对于 >= Python3.4:

    import importlib
    importlib.reload(module)
    

    对于

    import imp
    imp.reload(module)
    

    对于 Python2.x:

    使用内置的reload() 函数。

    reload(module)
    

    【讨论】:

    • 对我来说,如果我运行 imp.reload(plt)imp.reload(plt),上述两项工作,但如果我运行 imp.reload(script),则不会。 plt 由import matplotlib.pyplot as plt. Do you know why it won't work it i try to reload a script I myself wrote and previously imported? The following error is raced ModuleNotFoundError 设置为 matplotlib.pyplot:未找到模块“脚本”的规范
    【解决方案3】:
    import imp
    imp.reload(script4)
    

    【讨论】:

    • 自 Python 3.4 起已弃用 - 请改用 importlib
    【解决方案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
    

    【讨论】:

      【解决方案5】:

      我建议使用以下 sn-p,因为它适用于所有 python 版本(需要six):

      from six.moves import reload_module
      reload_module(module)
      

      【讨论】:

        【解决方案6】:

        如果您不想使用外部库,那么一种解决方案是从 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 重新加载.....

        【讨论】:

          【解决方案7】:

          为了兼容python2和python3,可以使用:

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

          【讨论】:

          • 这适用于 Python 3.7(及更早版本),但正如@Alex Martelli 在下面所写的那样被贬低。使用 Alleo 的答案'from Six.moves import reload_module'
          猜你喜欢
          • 2012-05-22
          • 2020-01-04
          • 2022-12-02
          • 1970-01-01
          • 2018-06-11
          • 2021-08-12
          • 2013-04-09
          • 1970-01-01
          相关资源
          最近更新 更多