2013-07-24 16 views
14

Mam dwa pliki app.py i mod_login.pyImportError: Nie można zaimportować nazwy

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

i Python zwrócić ten błąd:

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 

Jeśli usuniemy from app import app, kod będzie działał, ale jak mogę uzyskać dostęp do app.config?

+1

Co jeśli po prostu spróbować 'od importu mod_login *' i 'z aplikacjami import *' – Sebastian

+2

Prawdopodobny duplikat [ImportError: Nie można zaimportować nazwy X] (http://stackoverflow.com/questions/9252543/importerror-cannot-import-name-x) –

+0

@Sebastian Dzięki - to był wygaszacz! Nie widzę odwołania cyklicznego, ale nadal otrzymuję powyższy błąd. Używanie '*' pomogło. Zastanawiam się, jaka jest logika. – Anupam

Odpowiedz

29

Problemem jest to, że mają okrągły import: w app.py

from mod_login import mod_login 

w mod_login.py

from app import app 

jest to niedopuszczalne w Pythonie. Aby uzyskać więcej informacji, patrz Circular import dependency in Python. Krótko mówiąc, rozwiązanie to

  • albo zebrać wszystko w jednym dużym pliku
  • zwłoki jednego z importu z wykorzystaniem lokalnych import
+0

To jest dobre rozwiązanie, aby przenieść import do lokalnego zasięgu. Nie wymaga on wiele refaktoryzacji kodu i można go wykonać naprawdę szybko. – WhiteAngel

+0

Czy istnieje jakikolwiek inny powód, dla którego może się to stać? "nie można zaimportować nazwy X" – Martian2049

+0

Bez śledzenia wstecznego to tylko dzikie domysły ... – hivert

11

To również może się zdarzyć, jeśli pracuję na skryptach i funkcje i przenosiły je (tj. zmieniły lokalizację definicji), które mogły przypadkowo utworzyć odwołanie do pętli.

Może się okazać, że sytuacja jest rozwiązany, jeśli po prostu zresetować ipython Kernal aby usunąć stare zadania:

%reset 

lub Menu-> Uruchom ponownie zacisk

+1

dzięki człowieku. w mojej firmie budujemy pythona, ale działa również bez budowania, z wyjątkiem sytuacji, gdy zmieniłem nazwę wszystkich moich plików, tak jak powiedziałeś. więc to sprawiło, że pomyślałem, żeby się odbudować, co rozwiązało problem. woohoo! –

+3

W moim przypadku odszyfrowowałem pojedynczy skrypt Pythona do różnych modułów, pozostawiając stare pliki .py i .pyc i natknąłem się na błąd "nie można zaimportować nazwy". Po bezużytecznym wyszukiwaniu okrągłych odnośników, twoja odpowiedź postawiła mnie na właściwej drodze - usunięcie starych plików rozwiązało problem. dzięki – dipanda

+2

Chciałem zaznaczyć, że to był ratownik. Nie miałem odwołania cyklicznego i byłem kompletnie zdezorientowany, dlaczego tak się dzieje. –

1

Zamiast lokalnych importu, możesz zaimportuj cały moduł zamiast konkretnego obiektu. Następnie w module app, zadzwoń 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 
Powiązane problemy