python - modulos - ImportError: No se puede importar el nombre X
modulos python (8)
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 declaración 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
Tengo cuatro archivos diferentes nombrados: 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 <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
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 en general y luego en física, pero no conozco una solución alternativa. ¿Alguien puede ayudar?
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 codificación de caracteres.
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 a los contenidos del módulo antes de que esté listo, mediante el uso from x import y
. Esto es esencialmente lo mismo que
import x
y = x.y
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 compilados 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 = x.y
Como ya no hace referencia al contenido del módulo en el nivel superior, python puede compilar el módulo sin tener que acceder al contenido de la dependencia circular. Por nivel superior me refiero a las líneas que se ejecutarán durante la compilació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.
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:
- estas trabajando en
medicaltorch.py
- en ese script, tiene:
from medicaltorch import datasets as mt_datasets
donde se supone quemedicaltorch
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.
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.
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
.