Tecnología · GUÍA PRÁCTICA
¿Attempted relative import with no known parent package? Prueba primero el contexto
El punto inicial rara vez es el verdadero misterio. Registra cómo se inició el archivo, revisa __package__ y __spec__, y elige un solo contrato: módulo de paquete, comando instalado o script independiente.

Ejecuta exactamente el mismo comando que falló e imprime __name__, __package__, __spec__, sys.argv, el directorio actual y sys.path[0] antes de cambiar la importación. Un archivo puede estar dentro de una carpeta con aspecto de paquete y aun así ejecutarse como módulo superior __main__. La documentación de Python indica que, al ejecutar directamente un archivo fuente, __main__.__spec__ es None; por eso el punto inicial no tiene un paquete padre registrado.
La reparación duradera no consiste en probar más puntos. Decide si el código es un módulo de paquete, un comando instalado o un script independiente. Inicia el módulo con python -m package.module desde el directorio que contiene el paquete superior; publica un comando estable mediante [project.scripts]; o deja un lanzador mínimo fuera del paquete y usa importaciones absolutas. Después repite el comando previsto y registra el origen del módulo y los metadatos del paquete como prueba de salida.
1. Captura el lanzamiento que falló, no un sustituto limpio
Ejecuta exactamente el mismo comando que falló e imprime __name__, __package__, __spec__, sys.argv, el directorio actual y sys.path[0] antes de cambiar la importación. Un archivo puede estar dentro de una carpeta con aspecto de paquete y aun así ejecutarse como módulo superior __main__. La documentación de Python indica que, al ejecutar directamente un archivo fuente, __main__.__spec__ es None; por eso el punto inicial no tiene un paquete padre registrado. La ejecución directa de un archivo fuente deja __main__.__spec__ en None aunque el archivo pudiera importarse.
La reparación duradera no consiste en probar más puntos. Decide si el código es un módulo de paquete, un comando instalado o un script independiente. Inicia el módulo con python -m package.module desde el directorio que contiene el paquete superior; publica un comando estable mediante [project.scripts]; o deja un lanzador mínimo fuera del paquete y usa importaciones absolutas. Después repite el comando previsto y registra el origen del módulo y los metadatos del paquete como prueba de salida. python -m localiza el módulo mediante el sistema de importación y aporta metadatos del módulo.
2. Prueba la raíz del paquete y el nombre completo
Ejecuta exactamente el mismo comando que falló e imprime __name__, __package__, __spec__, sys.argv, el directorio actual y sys.path[0] antes de cambiar la importación. Un archivo puede estar dentro de una carpeta con aspecto de paquete y aun así ejecutarse como módulo superior __main__. La documentación de Python indica que, al ejecutar directamente un archivo fuente, __main__.__spec__ es None; por eso el punto inicial no tiene un paquete padre registrado. python -m localiza el módulo mediante el sistema de importación y aporta metadatos del módulo.
La reparación duradera no consiste en probar más puntos. Decide si el código es un módulo de paquete, un comando instalado o un script independiente. Inicia el módulo con python -m package.module desde el directorio que contiene el paquete superior; publica un comando estable mediante [project.scripts]; o deja un lanzador mínimo fuera del paquete y usa importaciones absolutas. Después repite el comando previsto y registra el origen del módulo y los metadatos del paquete como prueba de salida. Las importaciones relativas se resuelven desde el nombre del paquete actual, no por la cercanía visual de carpetas.
3. Elige un solo contrato de entrada
Ejecuta exactamente el mismo comando que falló e imprime __name__, __package__, __spec__, sys.argv, el directorio actual y sys.path[0] antes de cambiar la importación. Un archivo puede estar dentro de una carpeta con aspecto de paquete y aun así ejecutarse como módulo superior __main__. La documentación de Python indica que, al ejecutar directamente un archivo fuente, __main__.__spec__ es None; por eso el punto inicial no tiene un paquete padre registrado. Las importaciones relativas se resuelven desde el nombre del paquete actual, no por la cercanía visual de carpetas.
La reparación duradera no consiste en probar más puntos. Decide si el código es un módulo de paquete, un comando instalado o un script independiente. Inicia el módulo con python -m package.module desde el directorio que contiene el paquete superior; publica un comando estable mediante [project.scripts]; o deja un lanzador mínimo fuera del paquete y usa importaciones absolutas. Después repite el comando previsto y registra el origen del módulo y los metadatos del paquete como prueba de salida. Cambiar solo el directorio de trabajo no convierte la ejecución directa en ejecución de paquete.
4. Rechaza arreglos que solo trasladan el accidente
Ejecuta exactamente el mismo comando que falló e imprime __name__, __package__, __spec__, sys.argv, el directorio actual y sys.path[0] antes de cambiar la importación. Un archivo puede estar dentro de una carpeta con aspecto de paquete y aun así ejecutarse como módulo superior __main__. La documentación de Python indica que, al ejecutar directamente un archivo fuente, __main__.__spec__ es None; por eso el punto inicial no tiene un paquete padre registrado. Cambiar solo el directorio de trabajo no convierte la ejecución directa en ejecución de paquete.
La reparación duradera no consiste en probar más puntos. Decide si el código es un módulo de paquete, un comando instalado o un script independiente. Inicia el módulo con python -m package.module desde el directorio que contiene el paquete superior; publica un comando estable mediante [project.scripts]; o deja un lanzador mínimo fuera del paquete y usa importaciones absolutas. Después repite el comando previsto y registra el origen del módulo y los metadatos del paquete como prueba de salida. Los scripts de proyecto instalados llaman una función importable y evitan usar un archivo interno como frontera del comando.
5. Define la prueba de salida antes de quitar diagnósticos
Ejecuta exactamente el mismo comando que falló e imprime __name__, __package__, __spec__, sys.argv, el directorio actual y sys.path[0] antes de cambiar la importación. Un archivo puede estar dentro de una carpeta con aspecto de paquete y aun así ejecutarse como módulo superior __main__. La documentación de Python indica que, al ejecutar directamente un archivo fuente, __main__.__spec__ es None; por eso el punto inicial no tiene un paquete padre registrado. Los scripts de proyecto instalados llaman una función importable y evitan usar un archivo interno como frontera del comando.
La reparación duradera no consiste en probar más puntos. Decide si el código es un módulo de paquete, un comando instalado o un script independiente. Inicia el módulo con python -m package.module desde el directorio que contiene el paquete superior; publica un comando estable mediante [project.scripts]; o deja un lanzador mínimo fuera del paquete y usa importaciones absolutas. Después repite el comando previsto y registra el origen del módulo y los metadatos del paquete como prueba de salida. Una prueba de salida válida repite el comando real y registra los metadatos previstos y el origen importado.
