¿Qué puedo hacer con "ImportError: No se puede importar el nombre X" o "AttributeError: ... (probablemente debido a una importación circular)"?
Tengo un código distribuido en varios archivos que intentan separarse import
entre sí, de la siguiente manera:
principal.py:
from entity import Ent
entidad.py:
from physics import Physics
class Ent:
...
física.py:
from entity import Ent
class Physics:
...
Luego corro main.py
y aparece el siguiente error:
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
Supongo que el error se debe a la importación entity
dos veces, una vez main.py
y más tarde physics.py
, pero ¿cómo puedo solucionar el problema?
Consulte también ¿Qué sucede cuando se utilizan importaciones mutuas o circulares (cíclicas) en Python? para obtener una descripción general de lo que está permitido y lo que causa un problema en las importaciones circulares de WRT. Consulte ¿Por qué las importaciones circulares aparentemente funcionan más arriba en la pila de llamadas pero luego generan un ImportError más abajo? para obtener detalles técnicos sobre por qué y cómo ocurre el problema.
Tienes importaciones dependientes circulares. physics.py
se importa entity
antes de que se defina la clase Ent
e physics
intenta importar entity
que ya se está inicializando. Elimine la dependencia del physics
módulo entity
.
Si bien definitivamente debes evitar las dependencias circulares, puedes posponer 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.