2013-07-24 5 views
14

У меня есть два файла app.py и mod_login.pyImportError: не может импортировать имя

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') 

И питон вернуть эту ошибку:

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

Что делать, если вы просто попробовать 'от mod_login импорта *' и 'из приложения импорта *' – Sebastian

+2

Возможный дубликат [ImportError: невозможно импортировать имя X] (http://stackoverflow.com/questions/9252543/importerror-cannot-import-name-x) –

+0

@Sebastian Спасибо - это была заставка! Я не вижу круговой ссылки, но все еще получаю вышеуказанную ошибку. Использование '*' помогло. Интересно, какая логика. – Anupam

ответ

29

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

from mod_login import mod_login 

в mod_login.py

from app import app 

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

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

Это хорошее решение для перемещения импорта в локальную область. Это не требует много рефакторинга кода и может быть сделано очень быстро. – WhiteAngel

+0

есть ли другая причина, почему это может случиться? «невозможно импортировать имя X» – Martian2049

+0

Без обратной линии это просто дикая догадка ... – hivert

11

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

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

%reset 

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

+1

спасибо человеку. в моей компании мы строим питон, но он также работает без создания, за исключением случаев, когда я переименовал все мои файлы так же, как вы сказали. так что это заставило меня подумать, чтобы на самом деле перестроить, что решило проблему. Woohoo! –

+3

В моем случае я реорганизовал один скрипт python в разные модули, оставив некоторые старые .py и .pyc-файлы и наткнулся на ошибку «can not import name». После бесполезного поиска круговых ссылок ваш ответ поставил меня на правильный путь - удаление старых файлов делало трюк. спасибо – dipanda

+2

Хотел отметить, что это был спасатель. У меня не было круговой ссылки, и я был совершенно смущен, почему это происходит. –

1

Вместо того, чтобы использовать местный импорт, вы можете импортируйте весь модуль вместо конкретного объекта. Затем, в вашем 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 
Смежные вопросы