Comment gérer plusieurs versions de Python et environnements virtuels

Ajout janvier 2019: Si vous revenez sur ce blog après la mise à niveau vers macOS Mojave, veuillez consulter ce problème de github pour une solution au problème commun pyenv `` zlib non disponible ''.

Avant de commencer, passons brièvement en revue les termes utilisés dans le titre:

  • Plusieurs versions de Python : différentes installations de Python sur la même machine, 2.7 et 3.4 par exemple.
  • Environnements virtuels : environnements indépendants isolés qui peuvent avoir à la fois une version spécifique de Python et des packages spécifiques au projet installés en leur sein, sans affecter les autres projets.

Ici, nous allons examiner trois outils différents pour travailler avec ceux-ci, et quand vous pourriez en avoir besoin. Explorons les cas d'utilisation pour:

  • venv / pyvenv
  • pyenv
  • pyenv-virtualenv

Si vous utilisez une version unique de la version Python par exemple 3.3+ , et souhaitez gérer différents environnements virtuels, puis venvest tout ce dont vous avez besoin.

Si vous souhaitez utiliser plusieurs versions de Python à 3.3+ , avec ou sans environnements virtuels , continuez à lire pyenv.

Si vous souhaitez également travailler avec Python 2 , alors pyenv-virtualenvest un outil à considérer.

venv

Depuis Python 3.3+, le venvpackage est inclus. Il est idéal pour créer des environnements virtuels légers.

Jusqu'à Python 3.6, un script appelé pyvenvétait également inclus en tant que wrapper venv, mais cela est obsolète. Il sera complètement supprimé dans Python 3.8. La même fonctionnalité est disponible lors de l'utilisation venv, et toute documentation existante doit être mise à jour. Pour toute personne intéressée, vous pouvez lire les raisons de la dépréciation pyvenv.

venv permet de créer un nouvel environnement via la commande du terminal:

$ python3 -m venv directory-name-to-create

activé avec:

$ source name-given/bin/activate

et désactivé avec simplement:

$ deactivate

Si vous devez supprimer complètement l'environnement après l'avoir désactivé, vous pouvez exécuter:

$ rm -r name-given

Par défaut, l'environnement qu'il crée sera la version actuelle de Python que vous utilisez. Si vous écrivez de la documentation et que vous souhaitez obtenir la sécurité supplémentaire que la version correcte de Python est utilisée par votre lecteur, vous pouvez spécifier le numéro de version majeur et mineur dans la commande, comme ceci:

$ python3.6 -m venv example-three-six

Si le lecteur utilise une version autre que 3.6, la commande échouera et l'indiquera dans son message d'erreur. Cependant, toute version de correctif (par exemple la 3.6.4) fonctionnera.

Lorsque l'environnement est actif, tous les packages peuvent y être installés via pip. Par défaut, l'environnement nouvellement créé ne comprend aucun paquet déjà installé sur la machine. Comme piplui-même ne sera pas nécessairement installé sur la machine. Il est recommandé d'effectuer d'abord la mise pipà niveau vers la dernière version en utilisant pip install --upgrade pip.

Les projets auront généralement un requirements.txtfichier spécifiant ses dépendances. Cela permet à la commande de pip install -r requirements.txtcommande de raccourci d'installer rapidement tous les packages dans l'environnement virtuel nouvellement créé. Ils n'existeront que dans l'environnement virtuel. Il ne sera pas disponible lorsqu'il sera désactivé, mais persistera lorsqu'il sera réactivé.

Si vous n'avez pas besoin d'utiliser des versions supplémentaires de Python lui-même, c'est tout ce dont vous avez besoin pour créer des environnements virtuels isolés et spécifiques au projet.

pyenv

Si vous souhaitez utiliser plusieurs versions de Python sur une seule machine, il pyenvs'agit d'un outil couramment utilisé pour installer et basculer entre les versions. Cela ne doit pas être confondu avec le pyvenvscript déprécié mentionné précédemment . Il n'est pas fourni avec Python et doit être installé séparément.

La pyenvdocumentation comprend une excellente description de son fonctionnement, nous allons donc ici voir simplement comment l'utiliser.

Tout d'abord, nous devrons l'installer. Si vous utilisez Mac OS X, nous pouvons le faire en utilisant Homebrew, sinon envisager d'autres options d'installation.

$ brew update $ brew install pyenv

Ensuite, ajoutez ce qui suit vers le bas de vos scripts shell pour permettre pyenvde changer automatiquement de version pour vous:

eval "$(pyenv init -)"

Pour ce faire, ouvrez votre script shell en cours d'utilisation, via $ ~/.zshrc, $ ~/.bashrcou $ ~/.bash_profileet copiez et collez la ligne ci-dessus dans.

L'exécution pyenv versionsmontrera quelles versions de Python sont actuellement installées, avec une à *côté de celle actuellement utilisée. pyenv versionle montre directement et python --versionpeut être utilisé pour le vérifier.

Pour installer une version supplémentaire, par exemple 3.4.0, utilisez simplement pyenv install 3.4.0.

pyenv regarde à quatre endroits pour décider quelle version de Python utiliser, par ordre de priorité:

  1. La PYENV_VERSIONvariable d'environnement (si spécifiée). Vous pouvez utiliser la pyenv shellcommande pour définir cette variable d'environnement dans votre session shell actuelle.
  2. Le .python-versionfichier spécifique à l' application dans le répertoire actuel (le cas échéant). Vous pouvez modifier le .python-versionfichier du répertoire courant avec la pyenv localcommande.
  3. Le premier .python-versionfichier trouvé (le cas échéant) en recherchant dans chaque répertoire parent, jusqu'à atteindre la racine de votre système de fichiers.
  4. Le fichier de la version globale. Vous pouvez modifier ce fichier à l'aide de la pyenv globalcommande. Si le fichier de version globale n'est pas présent, pyenv suppose que vous souhaitez utiliser le Python «système». (En d'autres termes, quelle que soit la version qui fonctionnerait si pyenv n'était pas dans votre PATH.)

Lors de la configuration d'un nouveau projet qui doit utiliser Python 3.6.4, il pyenv local 3.6.4sera alors exécuté dans son répertoire racine. Cela définirait à la fois la version et créerait un .python-versionfichier, afin que les machines des autres contributeurs le récupèrent.

La description complète des pyenvcommandes est à mettre en signet.

pyenv et venv

Lorsque vous travaillez avec Python 3.3+, nous savons maintenant à la fois comment installer et basculer entre différentes versions de Python, et comment créer de nouveaux environnements virtuels.

À titre d'exemple, disons que nous configurions un projet qui devait utiliser Python 3.4.

Tout d'abord, nous pourrions définir notre version locale en utilisant pyenv local 3.4.0.

Si nous exécutions ensuite python3 -m venv example-projectun nouvel environnement virtuel serait configuré sous example-project, en utilisant notre Python 3.4.0 activé localement.

Nous activons en utilisant source example-project/bin/activateet pouvons commencer à travailler.

Ensuite, nous pourrions éventuellement documenter qu'un collaborateur devrait utiliser python3.4 -m venv . Cela signifie que même si un collaborateur n'utilisait pas pyenv, la python3.4commande ferait une erreur si leur version Python n'était pas la même version majeure et mineure (3 et 4), comme nous l'avions prévu.

Alternativement, nous pourrions choisir de simplement spécifier que 3.4.0 devait être utilisé et donner des instructions python3 -m venv . Si nous pensons qu'une valeur supérieure à 3,4 est acceptable, nous pouvons également choisir d'utiliser python3over python3.4, comme si le collaborateur utilisait 3,6, il recevrait également une erreur. Il s'agit d'une décision spécifique au projet.

pyenv-virtualenv

pyenvpeut être utilisé pour installer les versions Python 2 et 3. Cependant, comme nous l'avons vu, venvest limité aux versions de Python supérieures à 3.3.

pyenv-virtualenvest un outil pour créer des environnements virtuels intégrés pyenvet fonctionne pour toutes les versions de Python. Il est toujours recommandé d'utiliser le Python officiel venvlorsque cela est possible. Mais si, par exemple, vous créez un environnement virtuel basé sur 2.7.13, alors cela complimente pyenv.

Cela fonctionne également bien avec les condaenvironnements Anaconda et Miniconda si vous les utilisez déjà. Un outil appelé virtualenvexiste également. Ce n'est pas couvert ici, mais c'est lié à la fin.

Après l'installation, pyenvil peut ensuite être installé en utilisant Homebrew (ou des alternatives) comme suit:

$ brew install pyenv-virtualenv

Ensuite, dans votre .zshrc, .bashrcou .bash_profile(selon le shell que vous utilisez) ajoutez ce qui suit vers le bas:

eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"

Cela permet pyenvd'activer et de désactiver automatiquement les environnements lors du déplacement des répertoires.

Pour créer un nouvel environnement virtuel, utilisez:

$ pyenv virtualenv   // for example $ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10

Les environnements existants peuvent être répertoriés avec:

$ pyenv virtualenvs

Activé / désactivé avec:

$ pyenv activate  $ pyenv deactivate

Au moment de l'écriture, lors de l'utilisation, activatel'avertissement prompt changing will be removed from future releasesera affiché. Ceci est attendu et se réfère uniquement à l' (env-name)affichage dans votre shell, pas à l'utilisation de la activatecommande elle-même.

L'installation des exigences fonctionne comme décrit dans venv. Contrairement à venvune rm -rcommande n'est pas nécessaire pour supprimer un environnement, une uninstallcommande existe.

Dernières pensées

Entre ces trois outils, nous avons la possibilité de collaborer sur n'importe quel projet, quelle que soit la version de Python ou des dépendances requises. Nous savons également comment documenter les instructions de configuration que les autres peuvent utiliser pour tout projet sur lequel nous travaillons.

Nous pouvons également voir le raisonnement derrière quel ensemble utiliser, car tous les développeurs n'auront pas besoin des trois.

J'espère que cela a été utile et constitue une référence utile en combinaison avec la documentation liée ci-dessous.

Merci d'avoir lu! ?

Autres choses que j'ai explorées:

  • Mocking des modules ES et CommonJS avec jest.mock ()
  • Guide du débutant sur Elastic Container Service d'Amazon

Ressources

  • Environnements virtuels Python: une introduction
  • Déprécier pyvenv
  • venvDocumentation Python
  • venv contre virtualenv
  • Quelle est la différence entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc.?
  • Dois-je installer pip?