web-dev-qa-db-fra.com

ImportError: impossible d'importer le nom

J'ai deux fichiers app.py et 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')

Et python retourne cette erreur: 

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

Si je supprime from app import app, le code fonctionnera, mais comment puis-je accéder à app.config?

20
Patrick Burns

Le problème est que vous avez une importation circulaire: In app.py

from mod_login import mod_login

dans mod_login.py

from app import app

Ceci n'est pas autorisé en Python. Voir Dépendance à l'importation circulaire en Python pour plus d'informations. En bref, les solutions sont

  • soit tout rassembler dans un gros fichier
  • retarder l'une des importations en utilisant une importation locale
36
hivert

Cela peut aussi arriver si vous avez travaillé sur vos scripts et vos fonctions et que vous les avez déplacés (c'est-à-dire que vous avez modifié l'emplacement de la définition), ce qui aurait pu créer accidentellement une référence en boucle.

Vous constaterez peut-être que la situation est résolue si vous ne réinitialisez que l'iPython kernal pour effacer les anciennes attributions:

%reset

ou menu-> redémarrer le terminal

13
mjp

Au lieu d'utiliser des importations locales, vous pouvez importer l'ensemble du module au lieu de l'objet particulier. Ensuite, dans votre module app, appelez 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
2
Jivan

Lorsque cela est dans une console python si vous mettez à jour un module pour pouvoir l'utiliser via la console ne permet pas de réinitialiser, vous devez utiliser un

import importlib

et

importlib.reload (*module*)

susceptible de résoudre votre problème

1
Talles .Carvalho

Semblable à la réponse de @ mjp, mon problème a été résolu après la suppression de tous les fichiers .pyc.

0