Dans Python 3.8, il est proposé d'ajouter une alternative aux environnements virtuels - un répertoire local avec les packages PEP 582 Répertoire des packages locaux Python .
Ce PEP suggère d'ajouter un mécanisme pour détecter automatiquement le répertoire __pypackages__
en Python et l'utiliser lors de l'importation en tant que source de packages installés. Le répertoire __pypackages__
aura une priorité plus élevée à l'importation que les répertoires de packages globaux ou personnalisés. Cela empêchera la création, l'activation ou la désactivation d'environnements virtuels.
Voici à quoi ressemblera la structure du package utilisant __pypackages__
en Python 3.8:
foo __pypackages__ 3.8 lib bottle myscript.py
Dans cet article, je vais vous montrer comment utiliser le répertoire local avec des packages sans attendre la sortie de Python 3.8.
Cet article décrit un exemple de base testé sous Linux, Python 3.5. Pour d'autres plates-formes, vous devrez peut-être apporter des modifications.
Installation de packages dans un répertoire local
L'installation est presque la même que l'installation de packages à l'aide de pip, à l'exception de l'option --target
. Nous y indiquons le chemin complet ou relatif du répertoire avec les packages locaux.
pip3 install --target="$PWD/__pypackages__/3.5/lib/" bar
$ PWD est une variable avec le répertoire de travail actuel.
L'arborescence de répertoires suivante sera créée:
foo __pypackages__ 3.5 lib bar myscript.py
La version et les sous-répertoires Python doivent être spécifiés manuellement.
Il peut également y avoir des problèmes si vous devez installer des packages avec du code binaire et pour différentes architectures. Je n'avais pas de tels packages, mais comme solution, vous pouvez ajouter plus d'architecture à la structure de répertoires.
Une autre option d'installationIl existe une autre façon d'installer des packages dans un répertoire spécifique:
pip3 install --ignore-installed --install-option="--prefix=$PWD/__pypackages__" --install-option="--no-compile" bar
Mais vous devez spécifier le chemin complet vers l'emplacement d'installation et l'arborescence de répertoires sera différente de celle proposée dans PEP 582:
foo __pypackages__ lib python3.5 site-packages bar myscript.py
Utilisation du répertoire local avec des packages
Après avoir installé les packages, il reste à indiquer à l'interpréteur où chercher les dépendances.
Pour ce faire, ajoutez le chemin d'accès au répertoire local avec les packages à la liste sys.path
. Il suffit d'ajouter le chemin d'accès au module principal (premier chargé), l'ajout au reste n'est pas nécessaire. Après cela, vous pouvez importer des packages installés localement.
import os import sys _PATH = '/__pypackages__/3.5/lib/' sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + _PATH) import bar
La seule condition est que le module principal doit être au même niveau d'imbrication que le répertoire __pypackages__
.
Une autre façon de dire à Python où chercher les packages est de définir une variable d'environnement avant d'exécuter le script.
PYTHONPATH="$PWD/__pypackages__/3.5/lib/:$PYTHONPATH" python3 ./myscript.py
De manière si simple, vous pouvez obtenir des fonctionnalités similaires à PEP 582 en ce moment.