Déploiement d'Environnements Python 2.7 sur macOS Moderne (M1/M2)

La gestion de la compatibilité descendante est une exigence essentielle dans le développement logiciel. Elle assure la coexistence et le fonctionnement optimal des applications plus anciennes avec des systèmes d'exploitation ou des architectures matérielles récentes. Or, avec l'évolution de macOS, notamment depuis la version Monterey 12.3 et ultérieurement Ventura 13.1, l'interpréteur Python 2.x n'est plus inclus par défaut. Cette absence pose un défi majeur pour les développeurs travaillant sur des projets "hérités" qui dépendent encore de cette version de Python, en particulier sur les machines équipées de puces Apple Silicon (M1/M2).

Heureusement, plusieurs méthodes permettent de recréer un environnement Python 2.7 fonctionnel. Cet article explore deux approches principales : l'utilisation de conteneurs Docker et la gestion des versions via Pyenv.

Utilisation de Conteneurs Docker pour Python 2.x

L'approche par conteneurisation est souvent la plus simple et la plus robuste pour isoler des environnements de développement. Docker permet de créer des environnements portables et reproductibles, évitant les conflits de dépendances avec le système hôte.

Pour commencer, nous allons télécharger une image Docker préconfigurée de Python 2.7.18 :

docker pull python:2.7.18-slim-buster

Une fois l'image récupérée, vous pouvez lancer un conteneur et accéder directement à l'interpréteur Python. L'option --rm assure que le conteneur sera supprimé automatiquement à sa fermeture, évitant l'accumulation de conteneurs inactifs.

docker run -it --rm --name ancien_interpreteur_python python:2.7.18-slim-buster

Vous devriez voir une sortie similaire à celle-ci, indiquant que l'interpréteur Python 2.7 est prêt à l'emploi :

Python 2.7.18 (default, Apr 20 2020, 20:08:54) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Pour installer des bibliothèques spécifiques à votre projet, quittez l'interpréteur Python en tapant exit(). Ensuite, vous pouvez exécuter des commandes dans le conteneur en utilisant son ID ou son nom. Commencez par vérifier le nom de votre conteneur (ici : ancien_interpreteur_python) :

docker ps

La sortie affichera le conteneur en cours d'exécution et son ID :

CONTAINER ID   IMAGE                        COMMAND     CREATED             STATUS             PORTS     NAMES
xxxxxxxxxxxx   python:2.7.18-slim-buster    "python"    About a minute ago  Up About a minute            ancien_interpreteur_python

Maintenant, accédez au shell du conteneur pour installer des dépendances via pip. Remplacez xxxxxxxxxxxx par l'ID réel de votre conteneur :

docker exec -it xxxxxxxxxxxx /bin/bash

Dans le shell du conteneur, vous pouvez installer n'importe quelle bibliothèque, par exemple une ancienne version de requests :

pip install requests==2.18.4

Vous verrez des avertissements concernant la fin de vie de Python 2.7, mais l'installation devrait réussir :

DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting requests==2.18.4
  Downloading requests-2.18.4-py2.py3-none-any.whl (88 kB)
...
Successfully installed certifi-2022.9.14 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22

Pour sauvegarder cet environnement configuré avec ses dépendances, quittez le shell du conteneur (exit), puis créez une nouvelle image Docker à partir de l'état actuel de votre conteneur. Utilisez l'ID de votre conteneur :

docker commit xxxxxxxxxxxx mon_repo/python2_avec_libs:2.7.18

Désormais, vous pouvez lancer de nouveaux conteneurs à partir de cette image personnalisée, qui inclura toutes les dépendances préinstallées.

Gestion de Python 2.x avec Pyenv sur macOS

Si la conteneurisation ne convient pas à votre flux de travail, pyenv est une excellente solution pour gérer différentes versions de Python directement sur votre système macOS. Il permet de créer des environnements Python isolés, sans interférence avec la version système ou d'autres projets.

La première étape consiste à installer Homebrew, le gestionnaire de paquets incontournable pour macOS :

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Après l'installation de Homebrew, assurez-vous que tout est à jour :

brew update && brew upgrade

Installez ensuite pyenv :

brew install pyenv

Pour que pyenv fonctionne correctement, vous devez l'initialsier dans votre shell. Ajoutez les lignes suivantes à votre fichier de configuration de shell (par exemple, ~/.zshrc si vous utilisez Zsh, ou ~/.bashrc si vous utilisez Bash) :

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init --path)"\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

N'oubliez pas de recharger votre shell après avoir modifié le fichier de configuration :

source ~/.zshrc

Vous pouvez maintenant installer la version spécifique de Python 2.7 dont vous avez besoin :

pyenv install 2.7.18

Une fois Python 2.7.18 installé, vous pouvez l'activer pour votre session shell actuelle :

pyenv shell 2.7.18

Pour vérifier que la version correcte est active :

python --version

Cette commande devrait afficher Python 2.7.18. Vous pouvez maintenant utiliser pip pour installer des bibliothèques dans cet environnement virtuel, sans affecter votre installation Python système ou d'autres projets gérés par pyenv.

Étiquettes: Python 2.7 macOS Ventura Docker pyenv Homebrew

Publié le 28 juillet à 02h49