Articles

Comment utiliser pyenv pour exécuter plusieurs versions de Python sur un Mac

La gestion d’un environnement de développement Python local continue d’être un défi, même pour les développeurs expérimentés. Bien qu’il existe des stratégies bien documentées pour la gestion des paquets, une autre étape est nécessaire pour vous assurer d’exécuter la version de Python dont vous avez besoin au moment où vous en avez besoin.

Pourquoi la version de Python est-elle importante?

C’est un concept étrange au début, mais les langages de programmation changent comme n’importe quel autre logiciel. Ils ont des bugs, des corrections et des mises à jour comme n’importe laquelle de vos API préférées et de tout autre logiciel. De même, les différentes versions sont identifiées par un nombre à trois chiffres connu sous le nom de version sémantique.

😭😭😭 pic.twitter.com/yt1Z2439W8

— Denny Perez (@dennyperez18) 28 mai 2019

Pendant de nombreuses années, Python 2 était la version majeure couramment utilisée du langage de programmation. En janvier 2020, Python 2 est arrivé en fin de vie, et seul Python 3 sera désormais pris en charge par les principaux responsables du langage. Python 3 se développe régulièrement et publie régulièrement de nouvelles mises à jour. Il est donc important pour moi de recevoir régulièrement ces mises à jour.

Récemment, j’ai essayé d’exécuter un projet sur macOS qui dépendait de Python 3.5.9, une version que je n’avais pas installée sur mon système. Il peut sembler logique de penser que le gestionnaire de paquets Python pip pourrait l’installer *, mais ce n’était pas le cas:

$ pip install python3.5.9
Collecting python3.5.9
ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none)
ERROR: No matching distribution found for python3.5.9

Alternativement, j’aurais pu télécharger cette version à partir du site Web officiel de Python, mais comment pourrais-je l’exécuter sur mon Mac à côté de ma version existante de Python? Spécifier la version de Python que j’ai l’intention d’utiliser chaque fois que j’exécute l’interpréteur (python3.7 ou python3.5 par exemple) semble au mieux sujette aux erreurs. Il doit y avoir un meilleur moyen.

(Une note sur ce qui précède: Je sais que cela n’a aucun sens pour un développeur Python chevronné, mais cela avait du sens pour moi à l’époque. Je parlerais volontiers de pourquoi je pense toujours que cela devrait.)

Installation et configuration de pyenv

Heureusement, pyenv existe pour contourner cette série de complexités. Pour commencer, j’avais besoin d’installer pyenv. Je pourrais le cloner et le compiler moi-même à partir de la source, mais je préfère gérer des paquets comme celui-ci via le gestionnaire de paquets Homebrew:

$ brew install pyenv

Pour utiliser la version de Python via pyenv, il est essentiel de comprendre la variable PATH du shell. PATH détermine où le shell recherche les fichiers par le nom de la commande. Vous devez vous assurer que le shell trouvera la version de Python exécutée par pyenv, et non celle installée par défaut (souvent appelée version système). Si vous ne modifiez pas le chemin, voici le résultat :

$ which python
/usr/bin/python

C’est la version système de Python.

Pour configurer correctement pyenv, vous pouvez exécuter les opérations suivantes dans Bash ou zsh:

$ PATH=$(pyenv root)/shims:$PATH

Maintenant, si vous vérifiez la version de Python, vous verrez que c’est celle gérée par pyenv :

$ which python
/Users/my_username/.pyenv/shims/python

Cette instruction d’exportation (PATH=) ne changera que pour cette instance shell, alors faites-en un changement permanent, vous devez l’ajouter à vos fichiers dot. Puisque zsh est officiellement le shell par défaut de macOS, je vais me concentrer dessus. Ajoutez cette même syntaxe au ~/.fichier zshrc:

$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc

Maintenant, chaque fois que nous exécutons une commande dans zsh, elle utilisera la version pyenv de Python. Notez que j’ai utilisé des guillemets simples avec echo pour ne pas évaluer et développer les commandes.

Le.le fichier zshrc ne gère que les instances zsh, assurez-vous donc de vérifier quel est votre shell et de modifier les fichiers dot associés. Si vous devez vérifier quel est votre shell par défaut, vous pouvez exécuter echoSHELLSHELL. Si c’est zsh, utilisez la commande ci-dessus. Si vous utilisez Bash, changez ~/.zshrc à ~/.bashrc. Vous pouvez plonger profondément dans le réglage du chemin dans README de pyenv si vous souhaitez en savoir plus.

Utiliser pyenv pour gérer les versions de Python

Maintenant que pyenv est en contrôle, nous pouvons voir qu’il n’a que le système Python à sa disposition:

$ pyenv versions
system

Comme mentionné ci-dessus, vous ne voulez absolument pas utiliser cette version (en savoir plus sur pourquoi). Maintenant que pyenv est configuré correctement, je veux qu’il ait quelques versions différentes de Python que j’utilise régulièrement.

Il existe un moyen de voir toutes les versions de Python disponibles à partir de tous les différents dépôts auxquels pyenv a accès en exécutant pyenv installlistlist. C’est une longue liste écrasante qui pourrait être utile à revoir à l’avenir. Pour l’instant, je m’en tiens à la dernière de chaque version dot (3.5.x ou 3.6.x où x est le dernier) trouvé sur la page de téléchargement Python. Dans cet esprit, je vais installer 3.5.9 et 3.8.0:

$ pyenv install 3.5.9
$ pyenv install 3.8.0

Cela prendra un certain temps, alors prenez du thé (ou lisez l’un des liens ci-dessus). Il est intéressant de noter que la sortie parcourt le téléchargement et la construction de cette version de Python. Par exemple, la sortie indique que le fichier provient directement de Python.org .

Une fois que tout est installé, vous pouvez configurer vos paramètres par défaut. J’aime vivre à la pointe de la technologie, j’ai donc défini ma version globale de Python par défaut sur la dernière:

$ pyenv global 3.8.0

Et cette version est immédiatement définie dans mon shell. Pour confirmer:

$ python -V
Python 3.8.0

Le projet que je veux exécuter ne fonctionne qu’avec Python 3.5, donc je vais définir la version localement et confirmer qu’elle est utilisée:

$ pyenv local 3.5.9
$ python -V
Python 3.5.9

Parce que j’ai utilisé l’option locale avec pyenv, il a ajouté un fichier à mon répertoire actuel pour suivre ces informations.

$ cat .python-version
3.5.9

Maintenant, je peux enfin configurer un environnement virtuel pour le projet que je veux et être sûr d’exécuter la bonne version de Python.

$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python

Pour en savoir plus, consultez ce tutoriel sur la gestion des environnements virtuels sur un Mac.

Terminer

Par défaut, l’exécution de plusieurs versions de Python peut être un défi. Je trouve que commencer par pyenv garantit que j’ai les versions de Python dont j’ai besoin pour fonctionner quand j’en ai besoin.