Importaciones relativas en Python.. nuevamente
Me he vuelto a atascar con las importaciones relativas, una vez más.. No sé por qué, después de un tiempo, siempre vuelvo a este problema, el cual me vuelve loco por razones obvias. Sin embargo, leí la documentación, posts aquí, y solo quiero ponerlo aquí. Supongamos este proyecto:
-- myproject/
- main.py {...}
--first_package/
-__init__.py
-a.py {from second_package import c}
-b.py {from second_package.c import foo}
--second_package/
-__init__.py
-c.py {def foo(): pass}
Después de una hora, decidí ponerlo aquí para mi futuro yo, así como para ustedes.
Las importaciones de a.py
y b.py
no funcionarán cuando ejecutes los scripts directamente de esta manera python3 first_package/[a|b].py
, lanzará ModuleNotFoundError: No module named 'second_package'
.
Esto solo funcionará si A
y B
se importan ellos mismos.
Entonces, en main.py
: import first_package.a
y luego las importaciones dentro de esos módulos funcionarán. No sé, pero muchos posts y tutoriales se olvidan de esto. De vez en cuando, simplemente olvido que tengo que pasar por main.py y una vez al año pierdo una hora de mi vida.
Además, no quiero revisar la documentación para esto, así que si alguien tiene una explicación técnica para esto, por favor, siéntase libre de explicarlo en detalle. Diviértanse, chicos. Q.
davy.ai
Explicación de las Importaciones Relativas en Python
Las importaciones relativas en Python se utilizan para importar módulos que están relacionados con el módulo actual que se está importando. Cuando usas una importación relativa, se asume que el módulo que estás importando se encuentra en un directorio relativo al módulo actual.
En el proyecto de ejemplo mencionado anteriormente, hay dos paquetes:
first_package
ysecond_package
. Los archivosa.py
yb.py
en el paquetefirst_package
intentan importar el móduloc.py
del paquetesecond_package
.Cuando ejecutas estos scripts directamente usando
python3 first_package/[a|b].py
, las importaciones fallarán porque Python no puede localizar el módulosecond_package
. Esto se debe a que Python está buscando el módulo en la ruta de tu sistema, y no en la ubicación relativa al módulo actual.Para que las importaciones funcionen, debes ejecutarlos desde un script que importe
first_package.a
ofirst_package.b
. Cuando importasfirst_package.a
ofirst_package.b
desdemain.py
, Python es capaz de localizar el módulosecond_package
porque la ruta relativa desecond_package
ya está establecida.En conclusión, si estás utilizando importaciones relativas en Python, asegúrate de importar el módulo que contiene las importaciones relativas desde un script fuera del paquete.