ma_librairie/ ma_librairie/ # le code source, dans un dossier du meme nom __init__.py # rend le dossier importable comme un package core.py utils.py tests/ test_core.py pyproject.toml # configuration et metadonnees du projet README.md # description affichee sur PyPI LICENSE # licence d'utilisation (MIT, GPL...)# core.pydef addition(a, b): return a + b# utilisation depuis un autre fichier :# from core import addition# __init__.pyfrom .core import addition # le . = import relatif (dans le meme package)from .utils import formater# permet ensuite : from ma_librairie import addition# import relatif (depuis un fichier du meme package)from .utils import formater# import absolu (fonctionne partout, plus explicite)from ma_librairie.utils import formater[project]name = "ma_librairie"version = "1.0.0"description = "Librairie Python exemple"authors = [{name="Robin HENRY"}]dependencies = ["requests>=2.28"] # dependances necessaires au fonctionnement[build-system]requires = ["setuptools"]build-backend = "setuptools.build_meta"pip install -e . # installe depuis le dossier courant, en mode editable# tout changement dans le code source est immediatement pris en comptepython -m build# genere le dossier dist/ avec :# ma_librairie-1.0.0-py3-none-any.whl# ma_librairie-1.0.0.tar.gztwine upload dist/*# demande un identifiant/token PyPI# une fois publie, n'importe qui peut faire :# pip install ma_librairie# tests/test_core.pyfrom ma_librairie.core import additiondef test_addition(): assert addition(2, 3) == 5# executer tous les tests :# pytest tests/