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 se trouve 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 ensuite depuis 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 sur Python, mais je travaille avec C ++ depuis longtemps. Je suppose 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. Quelqu'un peut-il aider?
from <module> import <name>
, oufrom <modlue> import *
. Mieux vaut importer sous l'espace de noms du module pour éviter le risque d'écraser des références de nom identique.Entity
etVector
au lieu deEnt
etVect
, il n'y a aucune raison de raccourcir ces noms. Et oui, utilisezimport vector
et ensuitex = vector.Vector(0,0,0)
.Réponses:
Vous avez des importations dépendantes circulaires.
physics.py
est importéentity
avant que la classe neEnt
soit définie etphysics
essaie d'importerentity
qui est déjà en cours d'initialisation. Supprimez la dépendancephysics
duentity
module.la source
Entity
etPhysics
liés les uns aux autres? Je suis sûr qu'il existe une solution de contournement à ce que vous essayez de faire.Alors que vous devez absolument éviter les dépendances circulaires, vous pouvez différer les importations en python.
par exemple:
cela (au moins dans certains cas) contournera l'erreur.
la source
Il s'agit d'une dépendance circulaire. Il peut être résolu sans aucune modification structurelle du code. Le problème se produit parce que
vector
vous exigez qu'ilentity
soit rendu disponible immédiatement, et vice versa. 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 utilisantfrom x import y
. C'est essentiellement le même quePython est capable de détecter les dépendances circulaires et d'empêcher la boucle infinie des importations. Essentiellement, 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 les modules circulairement dépendants compilés, il met à jour le module importé. Cela fonctionne quelque chose comme ça.
Pour que python puisse fonctionner avec des dépendances circulaires, vous devez utiliser
import x
uniquement le style.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 pendant 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 causeront également des problèmes.la source
Si vous ne voulez pas changer la logique, vous pouvez placer l'instruction some import qui a causé ImportError à l'autre position du fichier, par exemple la fin.
a.py
b.py
Mais si nous changeons la position de from test.b import b2 in A comme ci-dessous:
a.py
Et nous pouvons obtenir ce que nous voulons:
la source
Il s'agit d'une dépendance circulaire. nous pouvons résoudre ce problème en utilisant le module ou la classe d' importation ou la fonction là où nous en avions besoin. si nous utilisons cette approche, nous pouvons corriger la dépendance circulaire
A.py
B.py
la source
Je viens de recevoir cette erreur aussi, pour une raison différente ...
Le script principal avait des fins de ligne Windows.
my_sub_module
avait des fins de ligne UNIX. Les changer pour être les mêmes a résolu le problème. Ils doivent également avoir le même codage de caractères.la source
Comme déjà mentionné, cela est dû à une dépendance circulaire . Ce qui n'a pas été mentionné, c'est que lorsque vous utilisez un module de typage Python et que vous importez une classe uniquement pour être utilisée pour annoter des types , vous pouvez utiliser des références Forward :
et supprimer la dépendance (l' importation ), par exemple au lieu de
faire:
(notez la
import
déclaration supprimée )la source
Ne nommez pas votre script python actuel avec le nom d'un autre module que vous importez
Lösung: renommez votre manuscrit de python fonctionnant
Exemple:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
oùmedicaltorch
est censé être un module installéCela échouera avec le
ImportError
. Renommez simplement votre script python de travail en 1.la source
Ne voyez pas encore celui-ci ici - c'est incroyablement stupide, mais assurez-vous d'importer la bonne variable / fonction.
Je recevais cette erreur
parce que ma variable était en fait
IMPLICIT_TIMEOUT
.lorsque j'ai changé mon importation pour utiliser le nom correct, je n'ai plus d'erreur 🤦♂️
la source
from PIL import Pillow
ne fonctionnait pas. 😠Si vous importez à
file1.py
partirfile2.py
et utilisé ceci:Les variables ci - dessous que
file1.py
ne peuvent pas être importés àfile2.py
cause__name__
ne est pas égal__main__
!Si vous souhaitez importer quelque chose de
file1.py
àfile2.py
, vous devez l'utiliser dansfile1.py
:En cas de doute, faites une
assert
déclaration pour déterminer si__name__=='__main__'
la source
Une façon de suivre l'erreur d'importation consiste à essayer pas à pas d'exécuter python sur chacun des fichiers importés pour en rechercher le mauvais.
vous obtenez quelque chose comme:
puis vous lancez:
puis vous lancez:
la source
Également pas directement pertinent pour l'OP, mais le fait de ne pas redémarrer une console PyCharm Python, après avoir ajouté un nouvel objet à un module, est également un excellent moyen d'obtenir un très déroutant
ImportError: Cannot import name ...
La partie déroutante est que PyCharm terminera automatiquement l'importation dans la console, mais l'importation échoue ensuite.
la source
Le problème est clair: dépendance circulaire entre les noms
entity
et lesphysics
modules.Indépendamment de l'importation de l'ensemble du module ou d'une classe, les noms doivent être chargés.
Regardez cet exemple:
Cela sera compilé en:
Avec un léger changement, nous pouvons résoudre ce problème:
Cela sera compilé en:
la source
Dans mon cas, je travaillais dans un cahier Jupyter et cela se produisait en raison de l'importation déjà mise en cache depuis que j'avais défini la classe / fonction dans mon fichier de travail.
J'ai redémarré mon noyau Jupyter et l'erreur a disparu.
la source
Pas spécifiquement pour ce demandeur, mais cette même erreur s'affichera si le nom de classe dans votre importation ne correspond pas à la définition dans le fichier à partir duquel vous importez.
la source