En Python 3.8, se propone agregar una alternativa a los entornos virtuales: un directorio local con paquetes PEP 582 Directorio de paquetes locales Python .
Este PEP sugiere agregar un mecanismo para detectar automáticamente el directorio __pypackages__
en Python y usarlo al importar como fuente de paquetes instalados. El directorio __pypackages__
tendrá mayor prioridad en la importación que los directorios de paquetes globales o personalizados. Esto evitará la creación, activación o desactivación de entornos virtuales.
Así es como se verá la estructura del paquete que usa __pypackages__
en Python 3.8:
foo __pypackages__ 3.8 lib bottle myscript.py
En este artículo, le mostraré cómo usar el directorio local con paquetes sin esperar a que Python 3.8 salga.
Este artículo describe un ejemplo básico probado en Linux, Python 3.5. Para otras plataformas, es posible que deba realizar cambios.
Instalar paquetes en un directorio local
La instalación es casi lo mismo que instalar paquetes usando pip, con la excepción de la opción --target
. En él indicamos la ruta completa o relativa al directorio con paquetes locales.
pip3 install --target="$PWD/__pypackages__/3.5/lib/" bar
$ PWD es una variable con el directorio de trabajo actual.
Se creará el siguiente árbol de directorios:
foo __pypackages__ 3.5 lib bar myscript.py
La versión y los subdirectorios de Python deben especificarse manualmente.
También puede haber problemas si necesita instalar paquetes con código binario y para diferentes arquitecturas. No tenía esos paquetes, pero como solución, puede agregar más arquitectura a la estructura del directorio.
Otra opción de instalaciónHay otra forma de instalar paquetes en un directorio específico:
pip3 install --ignore-installed --install-option="--prefix=$PWD/__pypackages__" --install-option="--no-compile" bar
Pero debe especificar la ruta completa a la ubicación de instalación y el árbol de directorios será diferente al propuesto en PEP 582:
foo __pypackages__ lib python3.5 site-packages bar myscript.py
Usando el directorio local con paquetes
Después de instalar los paquetes, queda por decirle al intérprete dónde buscar dependencias.
Para hacer esto, agregue la ruta al directorio local con paquetes a la lista sys.path
. Es suficiente agregar la ruta al módulo principal (primero cargado), no es necesario agregar al resto. Después de eso, puede importar paquetes instalados localmente.
import os import sys _PATH = '/__pypackages__/3.5/lib/' sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + _PATH) import bar
La única condición es que el módulo principal debe estar en el mismo nivel de anidamiento que el directorio __pypackages__
.
Otra forma de decirle a Python dónde buscar paquetes es establecer una variable de entorno antes de ejecutar el script.
PYTHONPATH="$PWD/__pypackages__/3.5/lib/:$PYTHONPATH" python3 ./myscript.py
De una manera tan simple, puede lograr una funcionalidad similar a la PEP 582 en este momento.