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 ejecuto desde 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
Soy muy nuevo en Python pero he trabajado con C ++ durante mucho tiempo. Supongo que el error se debe a la importación de la entidad dos veces, una vez en main y luego en física, pero no conozco una solución alternativa. ¿Alguien puede ayudar?
from <module> import <name>
, ofrom <modlue> import *
. Es mejor importar bajo el espacio de nombres del módulo para evitar la posibilidad de sobrescribir referencias con nombres idénticos.Entity
y enVector
lugar deEnt
yVect
, no hay razón para acortar esos nombres. Y sí, usaimport vector
y luegox = vector.Vector(0,0,0)
.Respuestas:
Tiene importaciones circulares dependientes.
physics.py
se importa deentity
antes de queEnt
se defina la clase ephysics
intenta importarentity
que ya se está inicializando. Elimine la dependencia dephysics
delentity
módulo.fuente
Entity
yPhysics
vinculados entre sí? Estoy seguro de que hay una solución para lo que estás tratando de hacer.Si bien definitivamente debe evitar las dependencias circulares, puede diferir las importaciones en python.
por ejemplo:
esto (al menos en algunos casos) evitará el error.
fuente
Esta es una dependencia circular. Se puede resolver sin modificaciones estructurales en el código. El problema se produce porque
vector
usted exige queentity
esté disponible para su uso inmediato, y viceversa. La razón de este problema es que usted solicita acceder al contenido del módulo antes de que esté listo, mediante el usofrom x import y
. Esto es esencialmente lo mismo quePython puede detectar dependencias circulares y evitar el ciclo 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 que se compilan los módulos dependientes circularmente, actualiza el módulo importado. Esto funciona algo como esto.
Para que Python pueda trabajar con dependencias circulares, debe usar
import x
solo estilo.Como ya no se está refiriendo a los contenidos del módulo en el nivel superior, python puede compilar el módulo sin tener que acceder a los contenidos 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 = x.y
). Las variables estáticas o de clase que acceden al contenido del módulo también causarán problemas.fuente
Si no desea cambiar la lógica, puede colocar alguna declaración de importación que causó ImportError en la otra posición del archivo, por ejemplo, al final.
a.py
b.py
Pero si cambiamos la posición de test.b importamos b2 en A como a continuación:
a.py
Y podemos obtener lo que queremos:
fuente
Esta es una dependencia circular. podemos resolver este problema usando import módulo de o clase o función donde lo necesitamos. si usamos este enfoque, podemos arreglar la dependencia circular
A.py
B.py
fuente
También recibí este error, por una razón diferente ...
El script principal tenía finales de línea de Windows.
my_sub_module
tenía terminaciones de línea UNIX. Cambiarlos para que sean los mismos solucionó el problema. También necesitan tener la misma codificación de caracteres.fuente
Como ya se mencionó, esto es causado por una dependencia circular . Lo que no se ha mencionado es que cuando usa el módulo de mecanografía Python e importa una clase solo para anotar Tipos , puede usar Reenviar referencias :
y eliminar la dependencia (la importación ), por ejemplo, en lugar de
hacer:
(tenga en cuenta la
import
declaración eliminada )fuente
No nombre su script actual de Python con el nombre de algún otro módulo que importe
Solución: cambie el nombre de su script de Python en funcionamiento
Ejemplo:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
dondemedicaltorch
se supone que es un módulo instaladoEsto fallará con el
ImportError
. Simplemente cambie el nombre de su script de Python en funcionamiento en 1.fuente
Todavía no veo este aquí, esto es increíblemente estúpido, pero asegúrese de importar la variable / función correcta.
Estaba recibiendo este error
porque mi variable fue en realidad
IMPLICIT_TIMEOUT
.cuando cambié mi importación para usar el nombre correcto, ya no recibí el error 🤦♂️
fuente
from PIL import Pillow
no estaba funcionando. 😠Si va a importar
file1.py
desdefile2.py
y utilizó la siguiente:Las variables a continuación que en
file1.py
no se pueden importar afile2.py
porque__name__
no es igual__main__
!Si desea importar algo de
file1.py
afile2.py
, debe usar esto enfile1.py
:En caso de duda, haga una
assert
declaración para determinar si__name__=='__main__'
fuente
Una forma de rastrear el error de importación es, paso a paso, tratar de ejecutar Python en cada uno de los archivos importados para rastrear el malo.
obtienes algo como:
entonces lanzas:
entonces lanzas:
fuente
Tampoco es directamente relevante para el OP, pero no reiniciar una consola PyCharm Python, después de agregar un nuevo objeto a un módulo, también es una excelente manera de obtener una muy confusa
ImportError: Cannot import name ...
La parte confuso es que PyCharm se completará automáticamente la importación en la consola, pero la importación a continuación, falla.
fuente
El problema es claro: dependencia circular entre los nombres
entity
y losphysics
módulos.Independientemente de importar todo el módulo o solo una clase, los nombres deben cargarse.
Mira este ejemplo:
Esto se compilará en:
Con un ligero cambio podemos resolver esto:
Esto se compilará en:
fuente
En mi caso, estaba trabajando en una computadora portátil Jupyter y esto estaba sucediendo debido a que la importación ya estaba en caché cuando definí la clase / función dentro de mi archivo de trabajo.
Reinicié mi núcleo Jupyter y el error desapareció.
fuente
No específicamente para este autor de la pregunta, pero este mismo error se mostrará si el nombre de la clase en su importación no coincide con la definición en el archivo desde el que está importando.
fuente