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?
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
.
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.
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.
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.
from test.b import b2
def a1():
print('a1')
b2()
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:
def a1():
print('a1')
b2()
from test.b import b2
Et on peut obtenir ce que l'on veut:
b1
a1
b2
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.
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()
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:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
où medicaltorch
est supposé être un module installéCela échouera avec le ImportError
. Il suffit de renommer votre script python de travail en 1.
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 ????