关于python:importError:无法导入名称

ImportError: cannot import name

我有两个文件:app.pymod_login.py

App.Py

1
2
3
4
5
6
7
8
from flask import Flask
from mod_login import mod_login

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

MyLogLogin

1
2
3
4
5
6
7
# 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返回这个错误:

1
2
3
4
5
6
7
8
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


问题是您有一个循环导入:在App.Py

1
from mod_login import mod_login

在MyLogLogin .Py中

1
from app import app

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

  • 要么把所有东西都集中在一个大文件里
  • 使用本地导入延迟一个导入


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

如果您将ipython内核重置为清除任何旧的分配,您可能会发现情况已解决:

1
%reset

或菜单->重启终端


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

App.Py

1
2
3
4
5
6
from flask import Flask
import mod_login

# ...

do_stuff_with(mod_login.mod_login)

MyLogLogin

1
2
3
from app import app

mod_login = something

当它在一个Python控制台中时,如果您更新一个模块以便能够通过控制台使用它,那么您必须使用一个

1
import importlib

1
importlib.reload (*module*)

可能会解决你的问题


与@mjp的答案类似,删除了所有.pyc文件后,我的问题得到了解决。