Python sous Ubuntu: réparer venv et pip

Python sous Ubuntu: réparer venv et pip

Source: Pixabay

Passant aujourd’hui le plus clair de mon temps professionnel dans du code Python 3.x, il n’était pas exclu que je tombe un jour sur l’un de ces petits « couacs » lié à la distribution du langage et de ses modules sur les différents systèmes d’exploitation du marché. En l’occurrence, je parlerai aujourd’hui du problème observé sur un Ubuntu 18.04 LTS. Cette version de l’une des distributions Linux les plus connues souffre d’un petit bémol: pip ne se met pas à jour dans le cadre de son intégration à de nouveaux environnements virtuels.

TL;DR: pour utiliser une version récente de pip dans tous les venvs que vous créerez à l’avenir, suivez les bouts de code de cet article ou du Shaarlink créé pour l’occasion.

Le gestionnaire de package pip est l’outil le plus utilisé par les Pythonistas dignes de ce nom afin d’accéder aux paquets réutilisables disponibles sur PyPI.org ou sur d’autres indexes disponibles çà et là (c’est très facile d’en mettre un en place sans brique technique particulière). Le problème survient lorsque vous souhaitez créer un environnement virtuel (venv). Lorsque l’on souhaite vérifier les versions de pip et Python, on voit:

$ pip3 --version
pip 19.1.1
$ python3 --version
Python 3.6.5

Jusqu’ici, mise à part que je dispose de la version 3.6 de Python et que je n’ai pas encore fait le pas vers la 3.7, tout se passe bien. La version 19.1.1 est la version de pip la plus récente au jour du test. Maintenant, que se passe-t-il lorsqu’on crée un environnement virtuel ?

$ python3 -m venv venv
$ source venv/bin/activate
$ pip --version
pip 9.0.3
$ python --version
Python 3.6.5

Oops ! Il semblerait que pip ait décidé d’utiliser une version sensiblement plus ancienne (la 9.0.3 date du 22 mars 2018). Mais alors que se passe-t-il ? La réponse se situe au niveau d’une librairie nommé « ensurepip » et de la manière qu’à Ubuntu de gérer les mises à jour de Python.

Pour faire court, la librairie « ensurepip » permet de préinstaller les nouveaux environnements virtuels avec pip et de garder cet outil le plus indépendant possible de Python. C’est cette librairie qui dit quelle version de pip devra être installée lorsque vous créez votre environnement virtuel.

Problème: les personnes en charges de la mise à jour du paquet « python-pip » ont apparemment quelques soucis de complexité à gérer, comme l’en atteste ce bug report sur Launchpad. Qu’est-ce que cela nous laisse comme options ? Et bien… regarder comment ensurepip fonctionne et tenter de le faire fonctionner mieux, voyons !

Une petite escapade du côté du fichier /usr/lib/python3.6/ensurepip/__init__.py nous apprend quelques jolis détails, particulièrement entre les lignes 61 et 67:

def version():
   """
   Returns a string specifying the bundled version of pip.
   """
   wheel_names = glob.glob('/usr/share/python-wheels/pip-*.whl')
   assert len(wheel_names) == 1, wheel_names
   return os.path.basename(wheel_names[0]).split('-')[1]

La partie qui nous intéresse est celle qui indique les fichiers « whl » (wheel) à aller chercher pour installer pip. Voilà qui est intéressant. Donc si on change le fichier wheel de pip disponible dans /usr/share/python-wheels/, on devrait arriver à fixer notre problème ! Vérifions donc via les étapes suivantes (code plus bas):

  1. Télécharger la dernière version de pip via pip lui-même (en mode Inception, tout à fait)
  2. Déplacer le fichier wheel obtenu dans le répertoire surveillé par ensurepip et archiver l’ancien
  3. Tester le tout en créant un nouvel environnement virtuel
$ cd ~/
$ pip3 download pip
Collecting pip
 Using cached https://files.pythonhosted.org/packages/5c/e0/be401c003291b56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl
 Saved ./pip-19.1.1-py2.py3-none-any.whl
Successfully downloaded pip

$ sudo mv pip-19.1.1-py2.py3-none-any.whl /usr/share/python-wheels
$ sudo mkdir /usr/share/python-wheels/old
$ sudo mv /usr/share/python-wheels/pip-9.0.1-py2.py3-none-any.whl /usr/share/python-wheels/old/

$ cd ~/Projects/MyProject
$ python3 -m venv venv
$ source venv/bin/activate
$ pip --version
pip 19.1.1

Woah, ça fonctionne ! Vous avez maintenant « hacké » votre installation locale pour que la dernière version de pip soit installée automatiquement dans vos nouveaux environnements virtuels !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.