La force de Python réside dans son vaste écosystème de bibliothèques tierces. Cependant, pour de nombreux développeurs, le parcours entre l'écriture d'un script et la distribution d'un package robuste reste une boîte noire. Comprendre comment emballer, construire et distribuer correctement les projets Python est essentiel pour tout développeur intermédiaire à avancé qui souhaite partager du code, collaborer sur des projets open source ou publier des outils internes sur un index privé.
Dans ce guide, nous démystifierons le paysage moderne de l'emballage Python. Nous dépasserons le monolithe obsolète setup.py et adopterons les normes plus récentes et plus robustes recommandées par l'autorité de l'emballage Python (PyPA).
Le passage de Setuptools à PEP 517/518
Historiquement, l'emballage Python reposait fortement sur setuptools et un fichier setup.py verbeux. Bien que fonctionnel, cette approche conduisait souvent à des builds fragiles et à une dispersion de la configuration. La communauté s'est depuis orientée vers des backends de build standardisés définis dans PEP 517 et PEP 518.
La nouvelle norme introduit deux fichiers clés :
- pyproject.toml : Déclare les exigences de build et les métadonnées du projet.
- backend de build : Un outil comme
setuptools,poetryouflitqui effectue le build réel.
Définir la structure de votre projet
Une structure de projet propre est la base d'un package maintenable. Bien qu'il existe de nombreuses variantes, une disposition moderne courante ressemble à ceci :
my_package/
├── pyproject.toml
├── README.md
├── LICENSE
└── src/
└── my_package/
├── __init__.py
├── core.py
└── utils.py
L'utilisation d'une disposition src/ est fortement recommandée. Elle empêche les importations accidentelles de fichiers locaux lors des tests et garantit que le package installé est toujours celui qui est testé, et non le code source dans votre répertoire actuel.
Configuration de pyproject.toml
Le fichier pyproject.toml est la seule source de vérité pour les métadonnées de votre projet. Voici un exemple de configuration utilisant setuptools comme backend de build, qui est la norme la plus largement adoptée.
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-awesome-package"
version = "0.1.0"
description = "Un exemple de package Python pour la démonstration."
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.8"
authors = [
{name = "Jane Developer", email = "jane@example.com"},
]
dependencies = [
"requests>=2.28.0",
"click>=8.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=22.0.0",
]
Points clés à noter dans cette configuration :
- Métadonnées dynamiques : Vous pouvez conserver les numéros de version dans des fichiers séparés pour éviter les mises à jour manuelles.
- Dépendances optionnelles : Les utilisateurs peuvent installer les outils de développement via
pip install my-package[dev]. - Contrainte de version Python : La définition explicite de
requires-python assure les vérifications de compatibilité.
Construction et distribution
Une fois votre pyproject.toml configuré, la construction de votre package est simple. Tout d'abord, assurez-vous d'avoir les derniers outils de build installés :
pip install build twine
Ensuite, exécutez la commande de build depuis la racine de votre projet. Cette commande génère un répertoire dist/ contenant une distribution source (sdist) et un fichier wheel.
python -m build
La sortie ressemblera à ceci :
Creating sdist archive: dist/my_awesome_package-0.1.0.tar.gz
Creating wheel archive: dist/my_awesome_package-0.1.0-py3-none-any.whl
Sdist contient le code source et nécessite que l'environnement de l'utilisateur construise le wheel lors de l'installation. Wheel est une distribution construite, prête à être installée, ce qui est généralement plus rapide et préféré pour la plupart des cas d'utilisation.
Tester avant de publier
Ne publiez jamais directement sur l'index PyPI en direct. Utilisez plutôt TestPyPI, une instance séparée pour les tests.
- Créez un compte sur test.pypi.org.
- Générez un jeton API dans les paramètres de votre compte.
- Téléchargez votre package en utilisant
twine:
twine upload --repository testpypi dist/*
Vous pouvez ensuite tester l'installation dans un environnement virtuel propre :
pip install --index-url https://test.pypi.org/simple/ --no-deps my-awesome-package
Conclusion
L'emballage Python a considérablement évolué, s'orientant vers la standardisation et la facilité d'utilisation. En adoptant des outils modernes et en suivant les bonnes pratiques telles que la disposition src/ et une configuration appropriée de pyproject.toml, vous vous assurez que vos packages sont robustes, reproductibles et faciles à consommer pour les autres. Que vous partagiez une bibliothèque avec la communauté ou que vous déployiez des outils internes, maîtriser ces étapes est une compétence critique dans la boîte à outils du développeur Python moderne.