【问题标题】:ImportError: cannot import nameImportError:无法导入名称
【发布时间】:2021-05-17 02:04:50
【问题描述】:

我有两个文件 app.py 和 mod_login.py

app.py

from flask import Flask
from mod_login import mod_login

app = Flask(__name__)
app.config.update(
    USERNAME='admin',
    PASSWORD='default'
)

mod_login.py

# coding: utf8

from flask import Blueprint, render_template, redirect, session, url_for, request
from functools import wraps
from app import app

mod_login = Blueprint('mod_login', __name__, template_folder='templates')

而python返回这个错误:

Traceback (most recent call last):
  File "app.py", line 2, in <module>
    from mod_login import mod_login
  File "mod_login.py", line 5, in <module>
    from app import app
  File "app.py", line 2, in <module>
    from mod_login import mod_login
ImportError: cannot import name mod_login

如果我删除from app import app,代码将起作用,但我如何才能访问app.config?

【问题讨论】:

  • 如果你尝试from mod_login import *和from app import *会怎样
  • @Sebastian 谢谢 - 这是一个节省!我没有看到循环引用,但仍然出现上述错误。使用* 有帮助。我想知道这是什么逻辑。
  • @Sebastian 我说得太早了。没有帮助。当我尝试使用该类时,它找不到它并给出导入错误。我知道没有循环导入,也尝试过删除所有 *.pyc 文件。不知道缺少什么

标签: python flask


【解决方案1】:

问题是你有一个循环导入: 在 app.py 中

from mod_login import mod_login

在 mod_login.py 中

from app import app

这在 Python 中是不允许的。请参阅Circular import dependency in Python 了解更多信息。总之,解决办法是

  • 要么将所有内容收集到一个大文件中
  • 使用本地导入延迟其中一项导入

【讨论】:

  • 这是将导入移动到本地范围的一个很好的解决方案。它不需要对代码进行大量重构,并且可以非常快地完成。
  • 还有其他原因导致这种情况发生吗? “无法导入名称 X”
【解决方案2】:

如果您一直在处理脚本和函数并且一直在移动它们(即更改定义的位置),这也可能发生,这可能会意外创建循环引用。

如果你只是重置 iPython 内核以清除任何旧的分配,你可能会发现情况已经解决了:

%reset

或菜单->重启终端

【讨论】:

  • 谢谢你。在我的公司,我们构建了 python,但它也可以在不构建的情况下工作,除非我像你说的那样重命名了我的所有文件。所以这让我想到真正重建,这解决了问题。哇哦!
  • 就我而言,我将单个 python 脚本重构为不同的模块,留下一些旧的 .py 和 .pyc 文件,并偶然发现“无法导入名称”错误。在对循环引用进行了无用的搜索之后,您的回答让我走上了正确的道路——删除旧文件就可以了。谢谢
  • 想指出这是救命稻草。我没有循环引用,并且对为什么会发生这种情况感到非常困惑。
【解决方案3】:

您可以导入整个模块而不是特定对象,而不是使用本地导入。然后,在您的 app 模块中,调用 mod_login.mod_login

app.py

from flask import Flask
import mod_login

# ...

do_stuff_with(mod_login.mod_login)

mod_login.py

from app import app

mod_login = something

【讨论】:

    【解决方案4】:

    当这是在 python 控制台中时,如果您更新一个模块以能够通过控制台使用它无助于重置,您必须使用一个

    import importlib
    

    和

    importlib.reload (*module*)
    

    可能会解决您的问题

    【讨论】:

      【解决方案5】:

      我是 Python 新手,在尝试重构代码时遇到了同样的错误。在我的情况下,错误的原因有点不同。

      我的代码写在一个文件中,我正在将它重新组织成模块。在将我的代码分组并尝试从run.py 运行烧瓶服务器后,我得到了错误。我尝试了这里给出的解决方案,但对我不起作用。

      然后我注意到我有 2 个不同的 __pycache__ 目录——一个在我的包中(在附加的 sn-p 中命名为 src),另一个在它外面。当我删除包外的__pycache__ 目录时,错误清除了,我可以运行烧瓶服务器了。

      |- __pycache__/     #deleting this directory solved it for me
      |-  src 
          |- __pycache__/
          |- __init__.py
          |- static/
          |- templates
          …
      

      希望这有帮助。

      【讨论】:

        猜你喜欢
        • 2016-03-31
        • 2014-10-10
        • 2014-09-20
        • 2014-08-28
        • 2014-06-10
        • 2016-05-16
        • 2019-05-25
        • 2017-04-22
        • 2020-04-16
        相关资源
        最近更新 更多