Gérer plusieurs versions de Python avec pyenv

Gérer plusieurs versions de Python avec pyenv

Avez-vous déjà voulu contribuer à un projet qui prend en charge plusieurs versions de Python, mais vous ne savez pas comment vous feriez facilementtest toutes les versions? Êtes-vous déjà curieux de connaître les dernières et meilleures versions de Python? Vous aimeriez peut-être essayer ces nouvelles fonctionnalités, mais vous ne voulez pas vous soucier de gâcher votre environnement de développement. Heureusement, gérer plusieurs versions de Python ne doit pas être déroutant si vous utilisezpyenv.

Cet article vous fournira un excellent aperçu de la façon de maximiser votre temps passé à travailler sur des projets et de minimiser le temps passé dans les maux de tête à essayer d'utiliser la bonne version de Python.

Dans cet article, vous apprendrez à:

  1. Installer plusieurs versions de Python

  2. Installez la dernière version de développement de Python

  3. Basculer entre les versions installées

  4. Utiliser des environnements virtuels avecpyenv

  5. Activer automatiquement différentes versions de Python et environnements virtuels

Free Bonus:Click here to get access to a chapter from Python Tricks: The Book qui vous montre les meilleures pratiques de Python avec des exemples simples que vous pouvez appliquer instantanément pour écrire du code + Pythonic plus beau.

Pourquoi utiliserpyenv?

pyenv est un outil formidable pour gérer plusieurs versions de Python. Même si Python est déjà installé sur votre système, il vaut la peine d'installerpyenv afin que vous puissiez facilement essayer de nouvelles fonctionnalités de langage ou contribuer à un projet qui est sur une version différente de Python.

Pourquoi ne pas utiliser System Python?

«System Python» est le Python qui est installé sur votre système d'exploitation. Si vous êtes sur Mac ou Linux, alors par défaut, lorsque vous tapezpython dans votre terminal, vous obtenez une belle REPL Python.

Alors pourquoi ne pas l'utiliser? Une façon de voir les choses est que ce Python est vraimentbelongs au système d'exploitation. Après tout, il est venu installé avec le système d'exploitation. Cela se reflète même lorsque vous exécutezwhich:

$ which python
/usr/bin/python

Ici,python est disponible pour tous les utilisateurs comme en témoigne son emplacement/usr/bin/python. Il y a de fortes chances que ce ne soit pas la version de Python que vous souhaitez non plus:

$ python -V
Pyhton 2.7.12

Pour installer un package dans votre système Python, vous devez exécutersudo pip install. C'est parce que vous installez le package Python globalement, ce qui est un vrai problème si un autre utilisateur vient et souhaite installer une version légèrement plus ancienne du package.

Les problèmes avec plusieurs versions du même package ont tendance à vous envahir et à vous mordre lorsque vous vous y attendez le moins. Un problème courant se présente sous la forme d'un package stable et populaire qui se comporte soudainement de manière incorrecte sur votre système. Après des heures de dépannage et de recherche sur Google, vous constaterez peut-être que vous avez installé la mauvaise version d'une dépendance, et cela gâche votre journée.

Même si votre version Python est installée dans/usr/local/bin/python3, vous n’êtes toujours pas en sécurité. Vous rencontrerez les mêmes autorisations et problèmes de flexibilité que ceux décrits ci-dessus.

De plus, vous n'avez pas vraiment de contrôle sur la version de Python installée sur votre système d'exploitation. Si vous souhaitez utiliser les dernières fonctionnalités de Python et que vous utilisez Ubuntu par exemple, vous risquez de ne pas avoir de chance. Les versions par défaut sont peut-être trop anciennes, ce qui signifie que vous n'aurez qu'à attendre qu'un nouveau système d'exploitation sorte.

Enfin, certains systèmes d'exploitation utilisent réellement le Python packagé pour le fonctionnement. Prenons par exempleyum, qui utilise beaucoup Python pour faire son travail. Si vous installez une nouvelle version de Python et ne faites pas attention à l'installer dans votre espace utilisateur, vous risquez de nuire gravement à votre capacité à utiliser votre système d'exploitation.

Qu'en est-il d'un gestionnaire de packages?

Le prochain endroit logique à regarder est les gestionnaires de packages. Les programmes tels queapt,yum,brew ouport sont les options suivantes typiques. Après tout, c'est ainsi que vous installez la plupart des packages sur votre système. Malheureusement, vous rencontrerez certains des mêmes problèmes en utilisant un gestionnaire de packages.

Par défaut, les gestionnaires de packages ont tendance à installer leurs packages dans l'espace système global au lieu de l'espace utilisateur. Encore une fois, ces packages au niveau du système polluent votre environnement de développement et rendent difficile le partage d'un espace de travail avec d'autres.

Encore une fois, vous n'avez toujours pas le contrôle sur la version de Python que vous pouvez installer. Il est vrai que certains référentiels vous offrent une plus grande sélection, mais par défaut, vous regardez quelle version de Python votre fournisseur particulier est à jour un jour donné.

Même si vous installez Python à partir d'un gestionnaire de packages, pensez à ce qui se passerait si vous écrivez un package et souhaitez prendre en charge et tester sur Python 3.4 - 3.7.

Que se passerait-il sur votre système lorsque vous tapezpython3? Comment basculeriez-vous rapidement entre les différentes versions? Vous pouvez certainement le faire, mais c'est fastidieux et sujet à erreur. Peu importe le fait que si vous voulez PyPy, Jython ou Miniconda, vous n’avez probablement pas de chance avec votre gestionnaire de paquets.

Avec ces contraintes à l'esprit, récapitulons les critères qui vous permettraient d'installer et de gérer les versions de Python facilement et de manière flexible:

  1. Installez Python dans votre espace utilisateur

  2. Installer plusieurs versions de Python

  3. Spécifiez la version Python exacte que vous souhaitez

  4. Basculer entre les versions installées

pyenv vous permet de faire toutes ces choses et plus encore.

Installation depyenv

Avant d'installerpyenv lui-même, vous allez avoir besoin de certaines dépendances spécifiques au système d'exploitation. Ces dépendances sont principalement des utilitaires de développement écrits en C et sont nécessaires carpyenv installe Python en construisant à partir des sources. Pour une description plus détaillée et une explication des dépendances de build, vous pouvez consulter lesofficial docs.. Dans ce didacticiel, vous découvrirez les méthodes les plus courantes pour installer ces dépendances.

Note:pyenv ne prenait pas initialement en charge Windows. Cependant, il semble y avoir un soutien de base avec le projetpyenv-win qui est récemment devenu actif. Si vous utilisez Windows, n'hésitez pas à le vérifier.

Créer des dépendances

pyenv construit Python à partir des sources, ce qui signifie que vous aurez besoin de dépendances de construction pour utiliser réellementpyenv. Les dépendances de génération varient selon la plate-forme. Si vous êtes surUbuntu/Debian et que vous souhaitez installer les dépendances de construction, vous pouvez utiliser ce qui suit:

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

Cela utiliseApt pour installer toutes les dépendances de construction. Laissez-le fonctionner et vous serez prêt à opter pour les systèmes Debian.

Si vous utilisezFedora/CentOS/RHEL, vous pouvez utiliseryum pour installer vos dépendances de construction:

$ sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel

Cette commande installera toutes les dépendances de construction pour Python en utilisantyum.

Les utilisateurs demacOS peuvent utiliser la commande suivante:

$ brew install openssl readline sqlite3 xz zlib

Cette commande s'appuie surHomebrew et installe les quelques dépendances pour les utilisateurs de macOS.

Tip: Lors de l'exécution de Mojave ou version ultérieure (10.14+), vous devrez également installer lesadditional SDK headers:

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

Merci à Rodrigo Viera pour la mise à jour.

Si vous utilisez à la placeopenSUSE, vous exécuterez la commande suivante:

$ zypper in zlib-devel bzip2 libbz2-devel libffi-devel \
libopenssl-devel readline-devel sqlite3 sqlite3-devel xz xz-devel

Encore une fois, cette commande installe toutes les dépendances de build Python pour votre système.

Enfin, pour les utilisateurs deAlpine, vous pouvez utiliser ceci:

$ apk add libffi-dev ncurses-dev openssl-dev readline-dev \
tk-dev xz-dev zlib-dev

Cette commande utiliseapk comme gestionnaire de paquets et installera toutes les dépendances de construction pour Python sur Alpine.

Utilisation du programme d'installation pyenv

Après avoir installé les dépendances de build, vous êtes prêt à installerpyenv lui-même. Je recommande d'utiliser lespyenv-installer project:

$ curl https://pyenv.run | bash

Cela installerapyenv avec quelques plugins utiles:

  1. pyenv: l'application réelle depyenv

  2. pyenv-virtualenv: Plugin pourpyenv et environnements virtuels

  3. pyenv-update: Plugin pour la mise à jour depyenv

  4. pyenv-doctor: Plugin pour vérifier quepyenv et les dépendances de construction sont installés

  5. pyenv-which-ext: Plugin pour rechercher automatiquement les commandes système

Note: La commande ci-dessus est identique au téléchargement dupyenv-installer script et à son exécution localement. Donc, si vous souhaitez voir exactement ce que vous exécutez, vous pouvez afficher le fichier vous-même. Sinon, si vous ne voulez vraiment pas exécuter de script, vous pouvez récupérer lesmanual installation instructions.

À la fin de la course, vous devriez voir quelque chose comme ceci:

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

La sortie sera basée sur votre shell. Mais vous devez suivre les instructions pour ajouterpyenv à votre chemin et pour initialiser la complétion automatique depyenv /pyenv-virtualenv. Une fois que vous avez fait cela, vous devez recharger votre shell:

$ exec "$SHELL" # Or just restart your terminal

C'est ça. Vous avez maintenant installépyenv et quatre plugins utiles.

Utilisation depyenv pour installer Python

Maintenant quepyenv est installé, l'installation de Python est l'étape suivante. Vous avez le choix entre plusieurs versions de Python. Si vous vouliez voir tous les CPython 3.6 à 3.8 disponibles, vous pouvez le faire:

$ pyenv install --list | grep " 3\.[678]"
  3.6.0
  3.6-dev
  3.6.1
  3.6.2
  3.6.3
  3.6.4
  3.6.5
  3.6.6
  3.6.7
  3.6.8
  3.7.0
  3.7-dev
  3.7.1
  3.7.2
  3.8-dev

Ce qui précède montre toutes les versions de Python quepyenv connaît et qui correspondent à l'expression régulière. Dans ce cas, il s'agit de toutes les versions CPython 3.6 à 3.8 disponibles. De même, si vous souhaitez voir toutes les versions de Jython, vous pouvez le faire:

$ pyenv install --list | grep "jython"
  jython-dev
  jython-2.5.0
  jython-2.5-dev
  jython-2.5.1
  jython-2.5.2
  jython-2.5.3
  jython-2.5.4-rc1
  jython-2.7.0
  jython-2.7.1

Encore une fois, vous pouvez voir toutes les versions de Jython quepyenv a à offrir. Si vous souhaitez voir toutes les versions, vous pouvez procéder comme suit:

$ pyenv install --list
...
# There are a lot

Une fois que vous avez trouvé la version souhaitée, vous pouvez l'installer avec une seule commande:

$ pyenv install -v 3.7.2
/tmp/python-build.20190208022403.30568 ~
Downloading Python-3.7.2.tar.xz...
-> https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
Installing Python-3.7.2...
/tmp/python-build.20190208022403.30568/Python-3.7.2 /tmp/python-build.20190208022403.30568 ~
[...]
Installing collected packages: setuptools, pip
Successfully installed pip-18.1 setuptools-40.6.2
Installed Python-3.7.2 to /home/realpython/.pyenv/versions/3.7.2

Having Problems? Lepyenv documentation a de bonnes notes d'installation ainsi que desFAQ utiles aveccommon build problems.

Cela prendra un certain temps carpyenv construit Python à partir des sources, mais une fois cela fait, vous aurez Python 3.7.2 disponible sur votre machine locale. Si vous ne voulez pas voir toute la sortie, supprimez simplement l’indicateur-v. Même les versions de développement de CPython peuvent être installées:

$ pyenv install 3.8-dev

Pro Tip: Si vous utilisezpyenv depuis un certain temps et que vous ne voyez pas la version que vous recherchez, vous devrez peut-être exécuterpyenv update pour mettre à jour l'outil et vous assurer de avoir accès aux dernières versions.

Pour le reste du didacticiel, les exemples supposent que vous avez installé3.6.8 et2.7.15, mais vous êtes libre de remplacer ces valeurs par les versions de Python que vous avez réellement installées. Notez également que la version système Python dans les exemples est2.7.12.

Emplacement d'installation

Comme mentionné précédemment,pyenv fonctionne en construisant Python à partir des sources. Chaque version que vous avez installée se trouve bien dans le répertoire racine de votrepyenv:

$ ls ~/.pyenv/versions/
2.7.15  3.6.8  3.8-dev

Toutes vos versions seront situées ici. C'est pratique car la suppression de ces versions est triviale:

$ rm -rf ~/.pyenv/versions/2.7.15

Bien sûr,pyenv fournit également une commande pour désinstaller une version particulière de Python:

$ pyenv uninstall 2.7.15

Utilisation de votre nouveau Python

Maintenant que vous avez installé deux versions différentes de Python, voyons quelques notions de base sur leur utilisation. Tout d'abord, vérifiez les versions de Python dont vous disposez:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

Le* indique que la version Python desystem est actuellement active. Vous remarquerez également que cela est défini par un fichier dans votre répertoire racinepyenv. Cela signifie que, par défaut, vous utilisez toujours votre système Python:

$ python -V
Python 2.7.12

Si vous essayez de le confirmer en utilisantwhich, vous verrez ceci:

$ which python
/home/realpython/.pyenv/shims/python

Cela peut être surprenant, mais c'est ainsi que fonctionnepyenv. pyenv s’insère dans votrePATH et du point de vue de votre OSis l’exécutable qui est appelé. Si vous souhaitez voir le chemin réel, vous pouvez exécuter ce qui suit:

$ pyenv which python
/usr/bin/python

Si, par exemple, vous souhaitez utiliser la version 2.7.15, vous pouvez utiliser la commandeglobal:

$ pyenv global 2.7.15
$ python -V
Python 2.7.15

$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.pyenv/version)
  3.6.8
  3.8-dev

Pro Tip: Un excellent moyen de s'assurer que la version de Python que vous venez d'installer fonctionne correctement est d'exécuter la suite de tests intégrée:

$ pyenv global 3.8-dev
$ python -m test

Cela lancera de nombreux tests Python internes qui vérifieront votre installation. Vous pouvez simplement vous détendre et regarder les tests passer.

Si vous souhaitez revenir à la version système de Python par défaut, vous pouvez exécuter ceci:

$ pyenv global system
$ python -V
Python 2.7.12

Vous pouvez désormais basculer facilement entre les différentes versions de Python. Ce n'est que le début. Si vous souhaitez basculer entre plusieurs versions, taper ces commandes de manière cohérente est fastidieux. Cette section passe en revue les bases, mais un meilleur flux de travail est décrit dansworking with multiple environments.

Exploration des commandespyenv

pyenv propose de nombreuses commandes. Vous pouvez voir une liste complète de toutes les commandes disponibles avec ceci:

$ pyenv commands
activate
commands
completions
deactivate
...
virtualenvs
whence
which

Cela génère tous les noms de commande. Chaque commande a un indicateur--help qui vous donnera des informations plus détaillées. Par exemple, si vous souhaitez voir plus d'informations sur la commandeshims, vous pouvez exécuter la commande suivante:

$ pyenv shims --help
Usage: pyenv shims [--short]

List existing pyenv shims

Le message d'aide décrit à quoi sert la commande et toutes les options que vous pouvez utiliser conjointement avec la commande. Dans les sections suivantes, vous trouverez un aperçu rapide et de haut niveau des commandes les plus utilisées.

install

Vous avez déjà vu la commandeinstall ci-dessus. Cette commande peut être utilisée pour installer une version spécifique de Python. Par exemple, si vous vouliez installer3.6.8, vous utiliseriez ceci:

$ pyenv install 3.6.8

La sortie nous montrepyenv en train de télécharger et d'installer Python. Certains des indicateurs communs que vous souhaiterez peut-être utiliser sont les suivants:

Flag La description

-l/--list

Répertorie toutes les versions de Python disponibles pour l'installation

-g/--debug

Construit une version de débogage de Python

-v/--verbose

Mode détaillé: affiche l'état de la compilation sur stdout

versions

La commandeversions affiche toutes les versions de Python actuellement installées:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

Cette sortie montre non seulement que2.7.15,3.6.8,3.8-dev et votresystem Python sont installés, mais vous montre également que lesystem Python est actif. Si vous ne vous souciez que de la version active actuelle, vous pouvez utiliser la commande suivante:

$ pyenv version
system (set by /home/realpython/.pyenv/version)

Cette commande est similaire àversions mais ne vous montre que la version actuelle de Python active.

which

La commandewhich est utile pour déterminer le chemin complet vers un exécutable système. Étant donné quepyenv fonctionne à l'aide de shims, cette commande vous permet de voir le chemin complet de l'exécutablepyenv en cours d'exécution. Par exemple, si vous voulez voir oùpip est installé, vous pouvez exécuter ceci:

$ pyenv which pip
/home/realpython/.pyenv/versions/3.6.8/bin/pip

La sortie affiche le chemin complet du système pourpip. Cela peut être utile lorsque vous avez installé des applications en ligne de commande.

global

La commandeglobal définit la version globale de Python. Cela peut être remplacé par d'autres commandes, mais est utile pour vous assurer que vous utilisez une version Python particulière par défaut. Si vous souhaitez utiliser3.6.8 par défaut, vous pouvez exécuter ceci:

$ pyenv global 3.6.8

Cette commande définit les~/.pyenv/version sur3.6.8. Pour plus d'informations, consultez la section sur lesspecifying your Python version.

local

La commandelocal est souvent utilisée pour définir une version Python spécifique à une application. Vous pouvez l'utiliser pour définir la version sur2.7.15:

$ pyenv local 2.7.15

Cette commande crée un fichier.python-version dans votre répertoire actuel. Si vous avezpyenv actif dans votre environnement, ce fichier activera automatiquement cette version pour vous.

shell

La commandeshell est utilisée pour définir une version Python spécifique au shell. Par exemple, si vous souhaitez tester la version3.8-dev de Python, vous pouvez le faire:

$ pyenv shell 3.8-dev

Cette commande active la version spécifiée en définissant la variable d'environnementPYENV_VERSION. Cette commande remplace toutes les applications ou les paramètres globaux que vous pourriez avoir. Si vous souhaitez désactiver la version, vous pouvez utiliser l'indicateur--unset.

Spécification de votre version Python

L'une des parties les plus déroutantes depyenv est de savoir comment exactement la commandepython est résolue et quelles commandes peuvent être utilisées pour la modifier. Comme mentionné dans les commandes, il existe 3 façons de modifier la version depython que vous utilisez. Alors, comment toutes ces commandes interagissent-elles entre elles? L'ordre de résolution ressemble un peu à ceci:

Pyenv pyramid for order of resolution

Cette pyramide est destinée à être lue de haut en bas. La première de ces options quepyenv peut trouver est l'option qu'il utilisera. Voyons un exemple rapide:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

Ici, votresystem Python est utilisé comme indiqué par les*. Pour utiliser le paramètre suivant le plus global, vous utilisezglobal:

$ pyenv global 3.6.8
$ pyenv versions
  system
  2.7.15
* 3.6.8 (set by /home/realpython/.pyenv/version)
  3.8-dev

Vous pouvez voir que maintenantpyenv veut utiliser3.6.8 comme version Python. Il indique même l'emplacement du fichier qu'il a trouvé. Ce fichier existe bel et bien, et vous pouvez lister son contenu:

$ cat ~/.pyenv/version
3.6.8

Maintenant, créons un fichier.python-version aveclocal:

$ pyenv local 2.7.15
$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.python-version)
  3.6.8
  3.8-dev
$ ls -a
.  ..  .python-version
$ cat .python-version
2.7.15

Là encore,pyenv indique comment il résoudrait notre commandepython. Cette fois, il vient de~/.python-version. Notez que la recherche de.python-version est récursive:

$ mkdir subdirectory
$ cd subdirectory
$ ls -la # Notice no .python-version file
. ..
$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.python-version)
  3.6.8
  3.8-dev

Même s'il n'y a pas de.python-version danssubdirectory, la version est toujours définie sur2.7.15 car.python-version existe dans un répertoire parent.

Enfin, vous pouvez définir la version Python avecshell:

$ pyenv shell 3.8-dev
$ pyenv versions
  system
  2.7.15
  3.6.8
* 3.8-dev (set by PYENV_VERSION environment variable)

Tout cela a été de définir la variable d'environnement$PYENV_VERSION:

$ echo $PYENV_VERSION
3.8-dev

Si vous vous sentez dépassé par les options, la section surworking with multiple environments passe en revue un processus avisé pour gérer ces fichiers, principalement en utilisantlocal.

Environnements virtuels etpyenv

Les environnements virtuels jouent un rôle important dans la gestion des installations et des applications Python. Si vous n’avez jamais entendu parler des environnements virtuels, vous pouvez consulterPython Virtual Environments: A Primer.

Les environnements virtuels et lespyenv sont un match fait au paradis. pyenv a un merveilleux plugin appelépyenv-virtualenv qui facilite le travail avec plusieurs environnements virtuels de plusieurs versions de Pythonand. Si vous vous demandez quelle est la différence entrepyenv,pyenv-virtualenv et des outils commevirtualenv ouvenv, ne vous inquiétez pas. Tu n'es pas seul.

Voici ce que vous devez savoir:

  • pyenv gère plusieurs versions de Python lui-même.

  • virtualenv/venv gère les environnements virtuels pour une version spécifique de Python.

  • pyenv-virtualenv gère les environnements virtuels pour différentes versions de Python.

Si vous êtes un utilisateur acharné devirtualenv ou devenv, ne vous inquiétez pas:pyenv joue bien avec l'un ou l'autre. En fait, vous pouvez conserver le même flux de travail que vous avez eu si vous préférez, même si je pense quepyenv-virtualenv offre une expérience plus agréable lorsque vous passez d'un environnement à l'autre nécessitant différentes versions de Python.

La bonne nouvelle est que puisque vous avez utilisé le scriptpyenv-installer pour installerpyenv, vous avez déjà installépyenv-virtualenv et prêt à fonctionner.

Création d'environnements virtuels

La création d'un environnement virtuel est une commande unique:

$ pyenv virtualenv  

Techniquement, le<python_version> est facultatif, mais vous devriez toujours le spécifier pour être sûr de la version de Python que vous utilisez.

Le<environment_name> est juste un nom pour vous aider à garder vos environnements séparés. Une bonne pratique consiste à nommer vos environnements du même nom que votre projet. Par exemple, si vous travailliez surmyproject et que vous vouliez développer avec Python 3.6.8, vous exécuteriez ceci:

$ pyenv virtualenv 3.6.8 myproject

La sortie inclut des messages qui montrent quelques paquets Python supplémentaires en cours d'installation, à savoirwheel,pip etsetuptools. Ceci est strictement pour des raisons de commodité et configure simplement un environnement plus complet pour chacun de vos environnements virtuels.

Activer vos versions

Maintenant que vous avez créé votre environnement virtuel, son utilisation est la prochaine étape. Normalement, vous devez activer vos environnements en exécutant ce qui suit:

$ pyenv local myproject

Vous avez déjà vu la commandepyenv local, mais cette fois, au lieu de spécifier une version Python, vous spécifiez un environnement. Cela crée un fichier.python-version dans votre répertoire de travail actuel et comme vous avez exécutéeval "$(pyenv virtualenv-init -)" dans votre environnement, l'environnement sera automatiquement activé.

Vous pouvez le vérifier en exécutant ce qui suit:

$ pyenv which python
/home/realpython/.pyenv/versions/myproject/bin/python

Vous pouvez voir qu'une nouvelle version a été créée appeléemyproject et que l'exécutable depython pointe vers cette version. Si vous regardez n'importe quel exécutable fourni par cet environnement, vous verrez la même chose. Prenons, par exemple,pip:

$ pyenv which pip
/home/realpython/.pyenv/versions/myproject/bin/pip

Si vous n'avez pas configuréeval "$(pyenv virtualenv-init -)" pour qu'il s'exécute dans votre shell, vous pouvez activer / désactiver manuellement vos versions Python avec ceci:

$ pyenv activate 
$ pyenv deactivate

Ce qui précède est ce que faitpyenv-virtualenv quand il entre ou sort d'un répertoire contenant un fichier.python-version.

Travailler avec plusieurs environnements

En rassemblant tout ce que vous avez appris, vous pouvez travailler efficacement avec plusieurs environnements. Supposons que les versions suivantes soient installées:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

Maintenant, vous voulez travailler sur deux projets différents, bien nommés:

  1. project1 prend en charge Python 2.7 et 3.6.

  2. project2 prend en charge Python 3.6 et expérimente avec 3.8-dev.

Vous pouvez voir que, par défaut, vous utilisez le système Python, qui est indiqué par les* dans la sortiepyenv versions. Créez d'abord un environnement virtuel pour le premier projet:

$ cd project1/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.6.8 project1
...
$ pyenv local project1
$ python -V
/home/realpython/.pyenv/versions/project1/bin/python

Enfin, notez que lorsque vouscd hors du répertoire, vous revenez par défaut au système Python:

$ cd $HOME
$ pyenv which python
/usr/bin/python

Vous pouvez suivre les étapes ci-dessus et créer un environnement virtuel pour project2:

$ cd project2/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.8-dev project2
...
$ pyenv local 3.8-dev
$ pyenv which python
/home/realpython/.pyenv/versions/3.8-dev/bin/python

Ce sont des étapes uniques pour vos projets. Maintenant, au fur et à mesure que vouscd entre les projets, vos environnements s'activeront automatiquement:

$ cd project2/
$ python -V
Python 3.8.0a0
$ cd ../project1
$ python -V
Python 3.6.8

Plus besoin de vous souvenir d'activer les environnements: vous pouvez basculer entre tous vos projets, etpyenv se chargera d'activer automatiquement les bonnes versions de Pythonand les bons environnements virtuels.

Activation simultanée de plusieurs versions

Comme décrit dans l'exemple ci-dessus,project2 utilise les fonctionnalités expérimentales de la version 3.8. Supposons que vous vouliez vous assurer que votre code fonctionne toujours sur Python 3.6. Si vous essayez d'exécuterpython3.6, vous obtiendrez ceci:

$ cd project2/
$ python3.6 -V
pyenv: python3.6: command not found

The `python3.6' command exists in these Python versions:
  3.6.8
  3.6.8/envs/project1
  project1

pyenv vous informe que, bien que Python 3.6 ne soit pas disponible dans l'environnement actif actuel, il est disponible dans d'autres environnements. pyenv vous donne un moyen d'activer plusieurs environnements à la fois à l'aide d'une commande familière:

$ pyenv local project2 3.6.8

Cela indique àpyenv que vous souhaitez utiliser l'environnement virtuelproject2 comme première option. Donc, si une commande, par exemplepython, peut être résolue dans les deux environnements, elle choisiraproject2 avant3.6.8. Voyons ce qui se passe si vous exécutez ceci:

$ python3.6 -V
Python 3.6.8

Ici,pyenv tente de trouver la commandepython3.6, et comme il la trouve dans un environnement actif, il permet à la commande de s'exécuter. Ceci est extrêmement utile pour les outils commetox qui nécessitent que plusieurs versions de Python soient disponibles sur vosPATH afin de s'exécuter.

Pro Tip: Si vous utilisez tox etpyenv, vous devriez vérifier le packagetox-pyenv.

Supposons que dans l'exemple ci-dessus, vous ayez trouvé un problème de compatibilité avec votre bibliothèque et que vous souhaitiez effectuer des tests locaux. Le test nécessite que vous installiez toutes les dépendances. Vous devez suivre les étapes pour créer un nouvel environnement:

$ pyenv virtualenv 3.6.8 project2-tmp
$ pyenv local project2-tmp

Une fois que vous êtes satisfait de vos tests locaux, vous pouvez facilement revenir à votre environnement par défaut:

$ pyenv local project2 3.6.8

Conclusion

Vous pouvez désormais contribuer plus facilement à un projet qui souhaite prendre en charge plusieurs environnements. Vous pouvez également tester plus facilement les dernières et meilleures versions de Python sans avoir à vous soucier de gâcher votre machine de développement, le tout avec un outil formidable:pyenv.

Vous avez vu commentpyenv peut vous aider:

  • Installer plusieurs versions de Python

  • Basculer entre les versions installées

  • Utiliser des environnements virtuels avecpyenv

  • Activer automatiquement différentes versions de Python et environnements virtuels

Si vous avez encore des questions, n'hésitez pas à nous contacter dans la section des commentaires ou sur Twitter. De plus, lepyenv documentation est une excellente ressource.

Bonus: affichage du nom de votre environnement dans votre invite de commande

Si vous êtes comme moi et que vous basculez constamment entre divers environnements virtuels et versions Python, il est facile de se tromper sur la version actuellement active. J'utiliseoh-my-zsh et lesagnoster theme, ce qui par défaut fait ressembler mon invite à ceci:

Agnoster theme with no pyenv prompt

En un coup d'œil, je ne sais pas quelle version de Python est active. Pour le comprendre, je devrais exécuterpython -V oupyenv version. Pour aider à réduire le temps que je passe à déterminer mon environnement Python actif, j'ajoute l'environnement virtuel depyenv que j'utilise à mon invite:

Environment name being shown in ZSH command prompt

Ma version Python dans ce cas estproject1-venv et s'affiche immédiatement au début de l'invite. Cela me permet de voir rapidement quelle version de Python j'utilise immédiatement. Si vous souhaitez également l'utiliser, vous pouvez utiliser mesagnoster-pyenv theme.