642 votes

ImportError: Impossible d'importer le nom X

J'ai quatre différents fichiers nommés: main, vecteur, d'une entité, et de la physique. Je ne vais pas poster tout le code, surtout juste les importations, parce que je pense que c'est là où est l'erreur. Mais si vous voulez, je peux plus poster.

Principales:

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

Physique:

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

Je puis exécutez à 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 à python, mais ont travaillé avec C++ pour un long moment. Je suppose que la cause est à partir de l'importation de l'entité à deux reprises, une fois en main, et plus tard dans la physique, mais je ne sais pas une solution de contournement. Aider quelqu'un?

572voto

Teemu Ikonen Points 3013

Vous avez des importations dépendantes de la circulaire. physics.py importé de entity avant classe Ent défini et physics essayant d'importer entity déjà initialisé . Supprimez la dépendance à physics du module entity .

164voto

bharling Points 786

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

par exemple:

 import SomeModule

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

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

127voto

Dunes Points 6740

C'est une dépendance circulaire. Il peut être résolu sans aucune modification de la structure du code. Le problème se produit parce que dans vector vous demande qu' entity disponibles immédiatement, et vice versa. La raison de ce problème est que demandez-vous pour accéder au contenu du module avant qu'il soit prêt -- à l'aide de from x import y. C'est essentiellement le même que

import x
y = x.y
del x

Python est capable de détecter les dépendances circulaires et éviter la boucle infinie des importations. Essentiellement tout ce qui se passe est qu'un espace réservé vide est créé pour le module (ie. il n'a pas de contenu). Une fois que la circulaire dépendante de la compilation des modules, il met à jour le module importé. C'est fonctionne quelque chose comme cela.

a = module() # import a

# rest of module

a.update_contents(real_a)

Pour python pour être en mesure de travailler avec des dépendances circulaires, vous devez utiliser import x seul style.

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

Puisque vous n'êtes plus en se référant au contenu du module au plus haut niveau, python, il est possible de compiler le module sans avoir à accéder au contenu de la circulaire de la dépendance. Par haut niveau, je veux dire les lignes qui seront exécutées lors de la compilation, par opposition au contenu de fonctions (par exemple. y = x.y). Statiques ou variables de classe accéder au module de contenu peut aussi causer des problèmes.

-8voto

Siya Points 9

Python est sensible à la casse, donc entity ! = Entity . Je suggère que vous modifiez le cas de entity dans vos importations pour qu'elles soient Entity . Cela résoudra votre problème.

-12voto

Carlos Neves Points 1

Votre main devrait être comme ceci principal:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X