33

我有两个文件app.pymod_login.py

应用程序.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

4

5 回答 5

62

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

from mod_login import mod_login

在 mod_login.py

from app import app

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

  • 要么将所有内容收集在一个大文件中
  • 使用本地导入延迟其中一项导入
于 2013-07-24T21:51:56.273 回答
28

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

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

%reset

或菜单->重启终端

于 2016-04-12T23:10:59.497 回答
5

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

应用程序.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
于 2016-04-19T13:52:19.937 回答
0

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

import importlib

importlib.reload (*module*)

可能会解决您的问题

于 2018-11-10T13:09:31.580 回答
0

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

我的代码写在一个文件中,我将它重新组织成模块。在将我的代码分组到模块中并尝试从run.py. 我尝试了这里给出的解决方案,但对我不起作用。

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

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

希望这会有所帮助。

于 2021-05-14T21:36:49.373 回答