ImportError:无法导入名称

Pat*_*rns 27 python flask

我有两个文件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'
)
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

并且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
Run Code Online (Sandbox Code Playgroud)

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

hiv*_*ert 44

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

from mod_login import mod_login
Run Code Online (Sandbox Code Playgroud)

在mod_login.py中

from app import app
Run Code Online (Sandbox Code Playgroud)

这在Python中是不允许的.有关详细信息,请参阅Python中的循环导入依赖项 简而言之,解决方案是

  • 或者将所有内容收集在一个大文件中
  • 使用本地导入延迟其中一个导入


mjp*_*mjp 15

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

如果您只是重置iPython核心以清除任何旧任务,您可能会发现情况已解决:

%reset
Run Code Online (Sandbox Code Playgroud)

或者菜单 - >重启终端

  • 在我的例子中,我将一个python脚本重构为不同的模块,留下一些旧的.py和.pyc文件,并偶然发现"无法导入名称"错误.在无用地搜索循环引用后,你的回答让我以正确的方式 - 删除旧文件就行了.谢谢 (3认同)
  • 想要指出这是救命稻草.我没有循环引用,并且彻底搞砸了为什么会发生这种情况. (3认同)
  • 谢啦。在我的公司,我们构建了 python,但它也可以在不构建的情况下工作,除非我像你说的那样重命名了我的所有文件。所以这让我想到真正重建,从而解决了问题。呜呼! (2认同)

Jiv*_*van 5

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

应用程序

from flask import Flask
import mod_login

# ...

do_stuff_with(mod_login.mod_login)
Run Code Online (Sandbox Code Playgroud)

mod_login.py

from app import app

mod_login = something
Run Code Online (Sandbox Code Playgroud)