Tecnología · GUÍA PRÁCTICA
¿Python muestra “bootstrapping phase”? Demuestra qué vuelve a importar spawn
El RuntimeError indica que un intérprete hijo volvió a importar el módulo de entrada mientras esa ruta iniciaba otro proceso. Registra el método de inicio y el lanzador, y mueve toda la creación de procesos tras el límite real de entrada.

El RuntimeError indica que un intérprete hijo volvió a importar el módulo de entrada mientras esa ruta iniciaba otro proceso. Registra el método de inicio y el lanzador, y mueve toda la creación de procesos tras el límite real de entrada.
La reparación solo queda aceptada cuando el lanzador original inicia un padre, los workers previstos se ejecutan una vez y el programa termina limpio sin forzar otro método de proceso.
1. Congela la ruta de lanzamiento que falla
Guarda el traceback completo del primer RuntimeError. Registra Python, sistema, sys.executable, sys.argv, __name__, __file__, get_start_method() y si lanzó una terminal, IDE, notebook, servicio o ejecutable congelado.
El marco superior de la aplicación antes de _check_not_importing_main identifica qué import o llamada intentó crear un hijo mientras spawn importaba el módulo de entrada.
2. Separa el trabajo de importación del punto de entrada
Definiciones, constantes y preparación segura pueden quedar a nivel de módulo. Mueve Pool, Process, Manager, ProcessPoolExecutor y llamadas que creen workers a main(), invocado solo bajo if __name__ == "__main__".
Un guard dentro de un helper llega tarde si el módulo de entrada llama al helper durante el import. Mantén los targets de worker a nivel de módulo para que sean importables y serializables.
3. Comprueba el método de inicio
Windows usa spawn y macOS moderno también lo usa por defecto. Python 3.14 cambió el valor POSIX de fork a forkserver donde está disponible, así que una actualización puede revelar imports recursivos antes ocultos.
No fuerces fork solo para ocultar el error. Usa get_context si una biblioteca necesita un método explícito y documenta la decisión en el límite de la aplicación.
4. Separa aplicaciones congeladas y pools de terceros
En un intérprete normal se puede omitir freeze_support. PyInstaller lo reemplaza porque el hijo ejecuta el mismo binario; llámalo en la entrada protegida y adelántalo solo si imports previos usan multiprocessing, argumentos o GUI.
Si el traceback entra en una biblioteca, confirma si n_jobs, workers o processes crea un pool. Un solo worker es un control diagnóstico; al restaurar el paralelismo la entrada aún debe ser segura.
5. Prueba con el mismo lanzador
Termina el árbol recursivo anterior y arranca de nuevo con el mismo lanzador y entorno. Confirma guard solo en el padre, targets solo en hijos, salida única y cierre sin huérfanos.
Conserva traceback, lanzador, método, cadena ofensiva, cambio y resultado en un registro. Prueba fuente y paquete si distribuyes ambos.
