Cuando se importa un módulo en Python, el intérprete lo busca en los directorios enumerados en sys.path. Primero busca entre los módulos estándar, luego entre archivos .py, .pyc y directorios con un archivo __init__.py (paquetes).
sys.modules.ModuleNotFoundError..pyc) y se almacena en caché (si hay permisos de escritura).# mypkg/__init__.py (puede estar vacío) # mypkg/mod.py # main.py import mypkg.mod
__init__.py (para Python <3.3 es obligatorio) — todo es importante.sys.path (siempre empieza por el directorio del script actual).from . import ..., importación absoluta/relativa).¿Qué sucederá si en el directorio de tu script hay un archivo llamado
random.pyy tratas de importar el módulo estándarrandom?
Se importará MI archivo local random.py, no la biblioteca estándar. Una causa común de errores difíciles de detectar es la colisión de nombres de módulos con bibliotecas (shadowing). Se debe ser cuidadoso al nombrar archivos.
Historia
En un gran proyecto, el módulo email.py accidentalmente oscureció el módulo estándar email de la biblioteca, y los desarrolladores no podían entender por qué no funcionaban las funciones de análisis de correo de bibliotecas externas.
Historia
En un proyecto de ML, la función os.path no funcionaba: junto al script principal había un archivo os.py, que interceptaba todas las llamadas al módulo estándar. Se gastó un mes en depuración hasta que se encontró el conflicto de nombres.
Historia
En un API REST de microservicios surgieron importaciones cíclicas al intentar realizar importaciones relativas de modelos entre varios subpaquetes. Se resolvió el problema solo después de refactorizar la estructura del proyecto y establecer un orden explícito de carga de módulos.