Modelo de ejecución en runtime
Este documento explica cómo vnma ejecuta scripts, carga paquetes de forma hermética y resuelve bibliotecas dinámicas sin entornos virtuales.
1. Ejecutar aplicaciones con vnma run
Para ejecutar el script de una aplicación con el runtime vendoreado activo:
vnma run main.py -- --option value
Ciclo de vida del proceso
Al invocar vnma run:
vnmalocaliza la raíz del proyecto y su directorio vendor.- Configura las variables de entorno:
PYTHONPATHincluyevendor/.vnma_meta/site(que contienesitecustomize.py) yvendor/.PATHanteponevendor/.vnma_meta/.bin/para exponer las herramientas CLI instaladas.PYTHONNOUSERSITE=1impide cargar los directorios de usuario.
- Lanza el intérprete de Python directamente:
Como la ejecución no usapython main.py --option valuepython -c "exec(...)",sys.argv[0]apunta correctamente amain.py, lo que preserva la compatibilidad conargparse, la inspección desys.argvy el módulomultiprocessing.
2. Ejecución directa con Python (import vendor.__bootstrap__)
Si prefieres lanzar tu aplicación directamente con python main.py sin usar la CLI de vnma:
Agrega el import del bootstrap al inicio de tu archivo de entrada:
import vendor.__bootstrap__
import requests
import pygame
# El código de la aplicación sigue...
Ejecuta vnma insert-import para agregar esta línea automáticamente. Consulta Puntos de entrada sin vnma run.
3. Aislamiento de rutas en runtime
Aísla la ejecución de tu aplicación:
- Identifica las rutas de la biblioteca estándar (
stdlib,platstdlib, archivos zip del intérprete). - Identifica los directorios de paquetes globales:
purelibyplatlib(site-packagesdel sistema).- Site-packages del usuario (
site.getusersitepackages()). - Rutas de paquetes de distribución (
dist-packages).
- Filtra
sys.pathen el lugar, eliminando los paquetes de terceros globales y de usuario, y conservando la biblioteca estándar de Python y el directorio localvendor/.
Esto evita el problema común de que el código funcione localmente porque una dependencia existe en el Python del sistema del desarrollador, pero falle al desplegarse en un contenedor limpio.
4. Registro nativo de DLL en Windows
En Windows con Python 3.8+, Python ya no busca en el PATH del sistema las DLL que necesitan las extensiones compiladas (.pyd).
En lugar de hacer recorridos recursivos del sistema de archivos (os.walk) al iniciar, vnma registra durante la instalación los directorios relativos exactos que contienen archivos .dll en una tupla estática:
_DLL_SUBDIRS = ['pygame', 'pygame/_sdl2']
Al iniciar:
__bootstrap__.pyrecorre_DLL_SUBDIRS.- Verifica que cada ruta esté estrictamente dentro de
VENDOR_ROOT(evita el secuestro de DLL mediante symlinks externos). - Invoca
os.add_dll_directory()y conserva el handle resultante en la colección global_DLL_HANDLESpara evitar que el recolector de basura lo libere.
5. Ejecutables CLI (vnma exec)
Cuando los paquetes declaran scripts de consola (p. ej. pytest, black, my-tool):
vnmagenera scripts wrapper ejecutables envendor/.vnma_meta/.bin/.- Los wrappers configuran
PYTHONPATHy lanzan la herramienta con el intérprete de Python del host.
Para invocar una herramienta instalada:
vnma exec my-tool --help
# o directamente en Windows:
.\vendor\.vnma_meta\.bin\my-tool.cmd --help