ImportError: невозможно импортировать имя

У меня есть два файла 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?

Ответы

Ответ 1

Проблема в том, что у вас есть циклический импорт: в app.py

from mod_login import mod_login

в mod_login.py

from app import app

Это не разрешено в Python. См. Циркулярная зависимость импорта в Python для получения дополнительной информации. Короче говоря, решение

  • либо собрать все в одном большом файле
  • Задержка одного из импорта с использованием локального импорта

Ответ 2

Это также может произойти, если вы работали над своими скриптами и функциями и перемещали их (т.е. меняли местоположение определения), которые могли случайно создать ссылку на цикл.

Вы можете обнаружить, что ситуация решена, если вы просто reset ядро ​​iPython очистите все старые назначения:

%reset

или меню- > перезапустить терминал

Ответ 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