web-dev-qa-db-fra.com

ImportError: impossible d'importer le nom X

J'ai quatre fichiers différents nommés: principal, vecteur, entité et physique. Je ne publierai pas tout le code, juste les importations, car je pense que c'est là que réside l'erreur. (Si vous voulez, je peux poster plus)

Principale:

import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement

Entité:

from vector import Vect
from physics import Physics
class Ent:
    #holds vector information and id
def tick(self, dt):
    #this is where physics changes the velocity and position vectors

Vecteur:

from math import *
class Vect:
    #holds i, j, k, and does vector math

La physique:

from entity import Ent
class Physics:
    #physics class gets an entity and does physics calculations on it.

Je lance alors à partir de main.py et j'obtiens l'erreur suivante:

Traceback (most recent call last):
File "main.py", line 2, in <module>
    from entity import Ent
File ".../entity.py", line 5, in <module>
    from physics import Physics
File ".../physics.py", line 2, in <module>
    from entity import Ent
ImportError: cannot import name Ent

Je suis très nouveau dans Python mais je travaille avec C++ depuis longtemps. J'imagine que l'erreur est due à l'importation de l'entité deux fois, une fois en principal et plus tard en physique, mais je ne connais pas de solution de contournement. Quelqu'un peut-il aider?

443
jsells

Vous avez des importations dépendantes circulaires. physics.py est importé de entity avant que la classe Ent ne soit définie et que physics tente d'importer entity déjà en cours d'initialisation. Supprimez la dépendance à physics du module entity.

431
Teemu Ikonen

Bien que vous devriez absolument éviter les dépendances circulaires, vous pouvez différer les importations en python.

par exemple:

import SomeModule

def someFunction(arg):
    from some.dependency import DependentClass

ceci (au moins dans certains cas) contournera l'erreur.

121
bharling

Ceci est une dépendance circulaire. Il peut être résolu sans aucune modification structurelle du code. Le problème se produit parce que, dans vector, vous exigez que entity soit immédiatement disponible, et inversement. La raison de ce problème est que vous demandez d'accéder au contenu du module avant qu'il ne soit prêt - en utilisant from x import y. C'est essentiellement la même chose que

import x
y = x.y
del x

Python est capable de détecter les dépendances circulaires et d’empêcher la boucle infinie d’importations. En gros, tout ce qui se passe est qu’un espace réservé vide est créé pour le module (c’est-à-dire qu’il n’a pas de contenu). Une fois que les modules dépendants de la circulaire sont compilés, il met à jour le module importé. Ceci fonctionne quelque chose comme ça.

a = module() # import a

# rest of module

a.update_contents(real_a)

Pour que python puisse travailler avec des dépendances circulaires, vous devez utiliser le style import x uniquement.

import x
class cls:
    def __init__(self):
        self.y = x.y

Puisque vous ne faites plus référence au contenu du module au niveau supérieur, python peut compiler le module sans avoir à accéder au contenu de la dépendance circulaire. Par niveau supérieur, j'entends les lignes qui seront exécutées lors de la compilation, par opposition au contenu des fonctions (par exemple, y = x.y). Les variables statiques ou de classe accédant au contenu du module poseront également des problèmes.

100
Dunes

Rendre la logique claire est très important. Ce problème apparaît, car la référence devient une boucle morte.

Si vous ne souhaitez pas modifier la logique, vous pouvez mettre la déclaration d'import qui a causé ImportError à l'autre position du fichier, par exemple la fin.

a.py

from test.b import b2

def a1():
    print('a1')
    b2()

b.py

from test.a import a1

def b1():
    print('b1')
    a1()

def b2():
    print('b2')

if __== '__main__':
    b1()

Vous obtiendrez une erreur d'importation: ImportError: cannot import name 'a1'

Mais si nous changeons la position de test.b, importez b2 dans A comme ci-dessous:

a.py

def a1():
    print('a1')
    b2()

from test.b import b2

Et on peut obtenir ce que l'on veut:

b1
a1
b2
18
g10guang

Je viens de recevoir cette erreur aussi, pour une raison différente ...

from my_sub_module import my_function

Le script principal avait des fins de ligne Windows. my_sub_module avait des fins de ligne UNIX. Les changer pour qu'ils soient identiques corrige le problème. Ils doivent également avoir le même encodage de caractères.

14
marengaz

Ceci est une dépendance circulaire. nous pouvons résoudre ce problème en utilisant import module ou classe ou fonction où nous en avions besoin. si nous utilisons cette approche, nous pouvons réparer la dépendance circulaire

A.py

from B import b2
def a1():
    print('a1')
    b2()

B.py

def b1():
   from A import a1
   print('b1')
   a1()

def b2():
   print('b2')
if __== '__main__':
   b1() 
6
a.patidar

Ne nommez pas votre script python actuel avec le nom d'un autre module que vous importez.

Solution: renommez votre script python de travail

Exemple:

  1. vous travaillez dans medicaltorch.py
  2. dans ce script, vous avez: from medicaltorch import datasets as mt_datasetsmedicaltorch est supposé être un module installé

Cela échouera avec le ImportError. Il suffit de renommer votre script python de travail en 1.

4
Paul

Ne voyez pas celui-ci ici pour l'instant - c'est incroyablement stupide, mais assurez-vous d'importer la bonne variable/fonction.

Je recevais cette erreur

ImportError: impossible d'importer le nom IMPLICIT_WAIT

parce que ma variable était en fait IMPLICIT_TIMEOUT.

quand j'ai changé mon importation pour utiliser le nom correct, je n'ai plus eu l'erreur ????

3
Nick Brady