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, juste les importations, parce que je pense que c'est là où est l'erreur. (Si vous voulez, je peux plus poster)
Principal:
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 l'erreur est due à 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. Quelqu'un peut-il aider?
- Quelle est la structure de répertoire de l'endroit où ils sont stockés et dans quels répertoires?
- jetez un oeil à cette réponse de la boucle de l'importation en python: stackoverflow.com/questions/7199466/...
- En général, ce n'est pas les bonnes pratiques de codage à faire
from <module> import <name>
, oufrom <modlue> import *
. Mieux à importer dans le cadre du module de l'espace de noms pour éviter la possibilité de remplacer à l'identique nommé références. - Ils sont tous dans le même répertoire nommé "code", donc pas de réelle structure.
- Donc, ce que Joël est en train de dire, je devrais probablement utiliser 'importation de vecteur et de l'utilisation de 'x = vecteur.Vect(0,0,0)'? Et peut-être que c'est clair?
- si le module est dans un sous-répertoire, est-il une réponse simple? L'importation fonctionne très bien à partir du répertoire contenant le module, mais pas à partir du répertoire parent. Il y a un __init__.py qui fonctionne jusqu'à ce qu'il ne peut pas importer de nom _foo. Pour l'enregistrement, _foo en C.
- Vous devriez juste d'appel de vos classes
Entity
etVector
au lieu deEnt
etVect
, il n'y a aucune raison de raccourcir ces noms. Et oui, l'utilisationimport vector
et puisx = vector.Vector(0,0,0)
. - Hey @Kevin puisque vous connaissez Java mieux, quelle est votre impression de ce 2008 article où l'auteur de la première phrase fait référence à la façon dont les dépendances circulaires sont "assez courant" en Java ?
- Toutes les grandes langues prend en charge la circulaire importations sans problème... C#, C, C++, Java, Objective-C... Ce n'est pas 1991.
- J'ai répondu à une question très semblable ici: stackoverflow.com/questions/50312470/...
- Si vous ne pouvez pas obtenir loin de dépendances circulaires, vous pouvez les importer directement dans la fonction ou de la classe dans laquelle vous avez besoin de la dépendance à la place de mondial pour le fichier
Vous devez vous connecter pour publier un commentaire.
Vous avez circulaire dépendante des importations.
physics.py
est importé deentity
avant la classeEnt
est défini etphysics
essaie d'importer desentity
qui est déjà en cours d'initialisation. Supprimer la dépendance àphysics
deentity
module.Entity
etPhysics
liés les uns aux autres? Je suis sûr qu'il ya une solution de contournement pour ce que vous essayez de faire.import a.b.c
, (où vous avez besoin de c), mais dans un.b il y a une importation faisant référence à ce fichier de procéder à l'importation, il sera toujours être cyclique de l'importation.Alors que vous devez absolument éviter les dépendances circulaires, vous pouvez reporter les importations en python.
par exemple:
(au moins dans certains cas ) va contourner l'erreur.
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 queentity
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 defrom x import y
. C'est essentiellement le même quePython 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.
Pour python pour être en mesure de travailler avec des dépendances circulaires, vous devez utiliser
import x
seul style.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.Si vous ne souhaitez pas changer de logique, vous pouvez mettre certains instruction d'importation qui a causé ImportError à l'autre position de fichier, par exemple la fin.
un.py
b.py
Mais si nous changeons la position de test.b importer b2 dans Un comme ci-dessous:
un.py
Et de la nous pouvons obtenir ce que nous voulons:
Je viens de recevoir cette erreur aussi, pour une autre raison...
Le script principal a Windows les fins de ligne.
my_sub_module
a des fins de ligne UNIX. Afin d'être le même résolu le problème. Ils doivent aussi avoir le même encodage des caractères.C'est une dépendance circulaire.
nous pouvons résoudre ce problème en utilisant importation ou module de classe ou d'une fonction où nous en avions besoin.
si nous utilisons cette approche, nous pouvons corriger dépendance circulaire
A. py
B. py
Ne pas le nom de votre script python avec le nom d'un autre module d'importation
Solution: renommer votre travail script python
Exemple:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
oùmedicaltorch
est censé être un module installéCela ne fonctionne pas avec le
ImportError
. Il suffit de renommer votre travail script python dans 1.Ne pas voir celui-là encore - c'est incroyablement stupide, mais assurez-vous que vous êtes à l'importation de la bonne variable/fonction.
J'ai été faire cette erreur
parce que ma variable est en fait
IMPLICIT_TIMEOUT
.quand j'ai changé mon importation d'utiliser le nom correct, je n'ai plus eu l'erreur ♂️
from PIL import Pillow
ne fonctionnait pas.