ImportError: No se puede importar el nombre X

Tengo cuatro archivos diferentes llamados: principal, vector, entidad y física. No publicaré todo el código, solo las importaciones, porque creo que ahí es donde está el error. (Si quieres, puedo publicar más).

Principal:

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

Entidad:

 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 

Vector:

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

Física:

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

Luego corro desde main.py y obtengo el siguiente error:

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

Soy muy nuevo en Python, pero he trabajado con C ++ durante mucho tiempo. Supongo que el error se debe a la entidad importadora dos veces, una vez en main y más tarde en física, pero no conozco una solución alternativa. ¿Alguien puede ayudar?

Tienes importaciones dependientes circulares. physics.py se importa de la entity antes de que se defina la clase Ent y la physics intenta importar la entity que ya se está inicializando. Eliminar la dependencia a la physics del módulo entity .

Si bien definitivamente debes evitar las dependencias circulares, puedes aplazar las importaciones en Python.

por ejemplo:

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

esto (al menos en algunos casos) evitará el error.

Esta es una dependencia circular. Se puede resolver sin modificaciones estructurales al código. El problema se produce porque en el vector usted exige que la entity esté disponible para su uso inmediato y viceversa. El motivo de este problema es que solicita acceder al contenido del módulo antes de que esté listo, mediante el uso from x import y . Esto es esencialmente lo mismo que

 import x y = xy del x 

Python es capaz de detectar dependencias circulares y evitar el bucle infinito de importaciones. Esencialmente, todo lo que sucede es que se crea un marcador de posición vacío para el módulo (es decir, no tiene contenido). Una vez comstackdos los módulos dependientes circularmente, se actualiza el módulo importado. Esto es algo como esto.

 a = module() # import a # rest of module a.update_contents(real_a) 

Para que Python pueda trabajar con dependencias circulares, debe usar el estilo import x solamente.

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

Dado que ya no hace referencia al contenido del módulo en el nivel superior, python puede comstackr el módulo sin tener que acceder al contenido de la dependencia circular. Por nivel superior me refiero a líneas que se ejecutarán durante la comstackción en lugar de los contenidos de las funciones (por ejemplo, y = xy ). Las variables estáticas o de clase que acceden al contenido del módulo también causarán problemas.

Para aclarar la lógica es muy importante. Este problema aparece, porque la referencia se convierte en un bucle muerto.

Si no desea cambiar la lógica, puede colocar alguna statement de importación que hizo que ImportError se ubique en la otra posición del archivo, por ejemplo, el final.

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 __name__ == '__main__': b1() 

Obtendrá Import Error: ImportError: cannot import name 'a1'

Pero si cambiamos la posición de from test.b import b2 en A como abajo:

a.py

 def a1(): print('a1') b2() from test.b import b2 

Y podemos conseguir lo que queremos:

 b1 a1 b2 

Acabo de recibir este error también, por una razón diferente …

 from my_sub_module import my_function 

La secuencia de comandos principal tenía finales de línea de Windows. my_sub_module tenía finales de línea UNIX. Cambiarlos para que sean los mismos solucionados el problema. También necesitan tener la misma encoding de caracteres.

No nombre su script de Python actual con el nombre de algún otro módulo que importe

Solución: cambie el nombre de su script de python de trabajo

Ejemplo:

  1. estas trabajando en medicaltorch.py
  2. en ese script, tiene: from medicaltorch import datasets as mt_datasets donde se supone que medicaltorch es un módulo instalado

Esto fallará con el ImportError . Solo cambia el nombre de tu script de python en 1.

No veas esto aquí todavía; esto es increíblemente estúpido, pero asegúrate de importar la variable / función correcta.

Estaba recibiendo este error

ImportError: no se puede importar el nombre IMPLICIT_WAIT

porque mi variable era en realidad IMPLICIT_TIMEOUT .

cuando cambié mi importación para usar el nombre correcto, ya no recibí el error 🤦‍♂️

Python distingue entre mayúsculas y minúsculas, por lo tanto entity ! = Entity . Le sugiero que cambie la carcasa de la entity en sus importaciones para que sea Entity . Esto solucionará tu problema.