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.