Avez-vous déjà pensé au fonctionnement des bibliothèques d'environnement virtuel en Python? Dans cet article, je propose de me familiariser avec le concept principal utilisé par toutes les bibliothèques pour les environnements, telles que virtualenv, virtualenvwrapper, conda, pipenv.
Au départ, en Python, il n'y avait pas de capacité intégrée pour créer des environnements, et cette fonctionnalité a été implémentée comme un hack. Il s'est avéré que toutes les bibliothèques sont basées sur une fonctionnalité très simple de l'interpréteur python.
Lorsque Python démarre l'interpréteur, il commence à rechercher le répertoire avec les modules (site-packages). La recherche commence par le répertoire parent concernant l'emplacement physique de l'exécutable de l'interpréteur (python.exe). Si le dossier du module n'est pas trouvé, alors Python monte d'un niveau et le fait jusqu'à ce que le répertoire racine soit atteint. Afin de comprendre qu'il s'agit d'un répertoire avec des modules, Python recherche le module os, qui doit être dans le fichier os.py et est requis pour que python fonctionne.
Imaginons que notre interprète se trouve dans
/usr/dev/lang/bin/python
. Ensuite, les chemins de recherche ressembleront à ceci:
/usr/dev/lang/lib/python3.7/os.py /usr/dev/lib/python3.7/os.py /usr/lib/python3.7/os.py /lib/python3.7/os.py
Comme vous pouvez le voir, Python ajoute un préfixe spécial (
lib/python$VERSION/os.py
) à notre chemin. Dès que l'interpréteur trouve la première correspondance (la présence du fichier os.py), il change
sys.prefix
et
sys.exec_prefix
en ce chemin (avec le préfixe supprimé). Si, pour une raison quelconque, aucune correspondance n'est trouvée, le chemin standard est utilisé, qui est compilé dans l'interpréteur.
Voyons maintenant comment fonctionne l'une des bibliothèques les plus anciennes et les plus célèbres, virtualenv.
user@arb:/usr/home/test
Après exécution, il crée des répertoires supplémentaires:
user@arb:/usr/home/test/ENV
Comme vous pouvez le voir, l'environnement virtuel a été créé en copiant le binaire Python dans un dossier local (ENV / bin / python). Nous pouvons également remarquer que le dossier parent contient
des liens symboliques vers les fichiers de bibliothèque standard python. Nous ne pouvons pas créer de lien symbolique vers le fichier exécutable, car l'interpréteur le renommera toujours en chemin réel.
Activons maintenant notre environnement:
user@arb:/usr/home/test
Cette commande modifie la variable d'environnement $ PATH afin que la commande
python
pointe vers notre version locale de python. Ceci est réalisé en remplaçant le chemin local du dossier bin au début de la ligne $ PATH afin que le chemin local ait priorité sur tous les chemins à droite.
export "/usr/home/test/ENV/bin:$PATH" echo $PATH
Si vous exécutez le script à partir de cet environnement, il sera exécuté en utilisant le binaire dans
/usr/home/test/ENV/bin/python
. L'interpréteur utilisera ce chemin comme point de départ pour rechercher des modules. Dans notre cas, les modules de la bibliothèque standard se trouvent sur le chemin
/usr/home/test/ENV/lib/python3.7/
.
C'est le hack principal, grâce auquel toutes les bibliothèques pour travailler avec des environnements virtuels fonctionnent.
Améliorations de Python 3
À partir de la version Python 3.3, un nouveau standard est apparu, appelé
PEP 405 , qui introduit un nouveau mécanisme pour les environnements légers.
Ce PEP ajoute une étape supplémentaire au processus de recherche. Si vous créez le
pyenv.cfg
configuration
pyenv.cfg
, au lieu de copier le binaire Python et tous ses modules, vous pouvez simplement indiquer leur emplacement dans cette configuration.
Cette fonctionnalité est activement utilisée par le module
venv standard, qui est apparu dans Python 3.
user@arb:/usr/home/test2
user@arb:/usr/home/test2
Grâce à cette configuration, au lieu de copier le binaire, venv crée simplement un lien vers celui-ci. Si le paramètre
include-system-site-packages
changé en
true
, tous les modules de la bibliothèque standard seront automatiquement accessibles à partir de l'environnement virtuel.
Malgré ces changements, la plupart des bibliothèques tierces pour travailler avec des environnements virtuels utilisent l'ancienne approche.
PS: je suis l'auteur de cet article, vous pouvez poser toutes vos questions.