Problème résolu par le mode Installation Éditable
En développement Python, modifier localement des packages et tester immédiatement les changements est fréquent. L'installation éditable évite de réinstaller systématiquement les packages après chaque modification.
Principe de fonctionnement
Ce mode crée un lien symbolique entre le code source et l'environnement Python via pip install -e . :
- Un lien symbolique est établi vers le répertoire source dans site-packages
- Python charge dynamiquement les ficihers sources lors de l'import
- Les dépendances restant gérées par pyproject.toml ou requirements.txt
Configuration de base
Projet traditionnel (setup.py)
# Création du projet
mkdir mon_projet && cd mon_projet
touch setup.py
# Installation éditable
pip install -e .
Projet moderne (pyproject.toml)
# pyproject.toml
[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "mon_projet"
version = "0.1.0"
dependencies = ["requests>=2.25"]
Structure de projet type
RACINE_PROJET
├─bin
├─config
├─src
│ ├─module_principal
│ ├─services
│ │ └─journalisation
│ └─outils
└─tests
Fichiers de configuration essentiels
pyproject.toml
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "Projet_IA"
version = "1.0.0"
[tool.setuptools]
package-dir = { "" = "src" }
setup.py
from setuptools import setup, find_packages
setup(
name="Projet_IA",
version="1.0.0",
packages=find_packages(where="src"),
package_dir={"": "src"},
install_requires=["requests>=2.21.0", "python-dotenv>=0.19.0"],
python_requires=">=3.10"
)
Initialisation des modules
Créer des fichiers __init__.py dans chaque répertoire de module.
Mise en œuvre
# Exécuter dans la racine du projet
pip install -e .
# Vérification
python -c "import module_principal; print(module_principal)"
Automatisation
Script d'installation
import os
import subprocess
import sys
chemin_racine = os.path.abspath(os.path.dirname(__file__))
os.chdir(chemin_racine)
subprocess.run([sys.executable, "-m", "pip", "install", "-e", "."])
Script de désinstallation
import os
import subprocess
import sys
chemin_racine = os.path.abspath(os.path.dirname(__file__))
os.chdir(chemin_racine)
subprocess.run([sys.executable, "-m", "pip", "uninstall", "-y", "Projet_IA"])
Avantages clés
- Modifications du code immédiatement effectives
- Environnemenst cohérents entre développement et production
- Gestion simplifiée des dépendances
- Intégration transparente avec les outils modernes