Vous avez deux types de paquets Python
un paquet que l’on dit pur Python, c’est-à-dire qu’il ne contient pas de partie qui doit être compilée.
un paquet avec des modules compilés comme ceux vus précédemment avec l’utilisation de
cython.
Dans le premier cas, la distribution est assez simple puisqu’elle ne dépend que de la version de Python. Le paquet peut s’installer sur n’importe quel système d’exploitation en copiant juste les fichiers Python au bon endroit.
Dans le cas de bout compilé, les choses se compliquent un peu, car il faut fournir des binaires et, par conséquent, il y a une dépendance au système d’exploitation, au compilateur utilisé... En d’autres termes, si vous souhaitez distribuer ce genre de paquet sur tous les systèmes d’exploitation, vous devez les avoir à votre disposition pour pouvoir créer les bons binaires.
Heureusement, vous n’êtes pas obligés d’avoir plusieurs machines pour réaliser cette opération. L’intégration continue peut grandement vous faciliter la vie comme nous le verrons à la fin de cette formation.
Les gestionnaires de paquets dans l’univers Python sont au nombre de deux : pypi et conda. Nous verrons dans la suite comment rendre disponible son application sur ces deux gestionnaires.
PyPi¶
Nous allons dans un premier temps nous intéresser à PyPi. Maintenant que nous avons un fichier pyproject.toml qui explique comment construire le package ainsi que ces dépendances, nous sommes en mesure de construire des distributions.
Dans PyPi, elles peuvent être de deux sortes
Archive et wheel¶
sdistcrée une archive de votre package.Lorsqu’un utilisateur utilise
pippour l’installer, l’archive est téléchargée puis la commandepip installest exécutée comme vu précédemment. La ligne de commandepython -m build --sdistcrée une archive dans le répertoire
dist.bdistcrée un binaire et est donc spécifique à une plateforme si des modules sont compilés. Ceci permet d’avoir une installation beaucoup plus rapide du fait qu’il n’y a pas de processus de compilation. Ce binaire est appeléwheelset est obtenu à partir de la ligne de commandepython -m build --wheelIl existe plusieurs variantes :
Lorsque le package ne contient que des fichiers Python.
On a alors dans le répertoire
distle fichiercalculator-0.1.1-py3-none-any.whl.Lorsque le package contient des fichiers compilés.
On a alors dans le répertoire
distle fichiercalculator-0.1.0-cp312-cp312-macosx_11_0_arm64.whl. Ce fichier nous renseigne sur la version Python, l’OS et le type d’architecture pour qui est destiné ce binaire. Dans toute autre configuration, le binaire ne sera pas installable. Il vous faut donc toutes les variantes pour pouvoir avoir l’ensemble de binaires.
Maintenant que vous avez les différentes versions, vous pouvez les mettre sur PyPi pour que d’autres personnes puissent utiliser votre application.
twine¶
twine permet de mettre les distributions créées se trouvant dans le répertoire dist sur PyPi. Il existe deux sites
https://pypi.org/ (le site officiel)
https://
test .pypi .org/ (le site pour faire des tests)
Avant d’utiliser twine, il est nécessaire de se créer un compte
Pour mettre l’ensemble des distributions sur
pypi.orgtwine upload dist/*test.pypi.orgtwine upload --repository-url https://test.pypi.org/legacy/ dist/*
Une fois que vous avez effectué l’upload, vous pouvez vérifier que votre paquet est bien disponible en visitant la page de votre projet sur pypi.org ou test.pypi.org. Vous pouvez aussi l’installer directement avec pip :
Depuis PyPi
pip install calculatorDepuis Test PyPi
pip install --index-url https://test.pypi.org/simple/ calculator
conda¶
Il est également possible de mettre son package sur conda. Comme pour PyPi, il est nécessaire de se créer un compte pour pouvoir avoir sa propre channel (https://
Il est ensuite nécessaire d’installer différents outils pour pouvoir uploader vos fichiers.
conda install conda-build anaconda-clientIl est possible d’installer des packages qui ne sont pas forcément écrits en Python.
conda-forge est un endroit où l’on peut trouver ces packages.
Le but est d’écrire des recettes permettant de compiler le projet sur différentes plateformes (linux, mac OSX, windows).
Le processus de soumission peut être assez long, c’est pourquoi nous utiliserons notre propre channel dans la suite. Si vous souhaitez mettre vos applications sur conda-forge (ce qui est une très bonne idée, car cela offre plus de visibilité que sur sa propre channel), il suffit d’aller ici : https://
Création d’une recette¶
Pour que conda puisse construire le binaire de votre application, il lui faut plusieurs fichiers que l’on retrouve généralement dans un répertoire recipes.
meta.yamlCe fichier définit l’ensemble des méta données de la recette permettant de créer le package conda (voir https://
docs .conda .io /projects /conda -build /en /latest /resources /define -metadata .html) build.shCe fichier indique comment construire des parties qui ne peuvent pas être produite par la recette (compilation, ajout de fichiers externes...) pour les systèmes linux et macos.
build.batCe fichier indique comment construire des parties qui ne peuvent pas être produite par la recette (compilation, ajout de fichiers externes...) pour le système windows.
Nous ne verrons ici que l’écriture d’un fichier meta.yaml. Reprenons l’exemple de l’application calculator et regardons ce que ça donne
{% set name = "calculator" %}
{% set version = "0.1.1" %}
package:
name: '{{ name|lower }}'
version: '{{ version }}'
source:
path: ../
build:
number: 0
script: "{{PYTHON}} -m pip install . --no-deps -vv"
noarch: python
requirements:
build:
- python
- setuptools
- cython
run:
- python
test:
imports:
- calculator
about:
home: http://github.com/gouarin/calculator
license: MIT
description: Simple calculator project
extra:
recipe-maintainers: Loic Gouarin <loic.gouarin@gmail.com>Une fois les fichiers du répertoire recipes sont écrits, il faut exécuter la commande suivante
conda build recipesÀ la fin de la procédure, vous devriez voir où il a mis le package en local. Vous pouvez alors essayer de l’installer en faisant
conda install --use-local calculatorUploader le paquet¶
Si tout s’est bien passé, vous pouvez à présent le mettre sur anaconda dans votre channel pour que d’autres puissent l’installer. Il vous faut pour cela anaconda-client.
conda install anaconda-clientVous pouvez maintenant l’uploader.
anaconda upload /home/loic/miniconda3/conda-bld/linux-64/calculator-0.1.1-py36h585410b_0.tar.bz2Ce qu’on a accompli¶
Cette partie était dense, mais vous avez maintenant toutes les clés pour distribuer votre projet :
Vous savez construire des sdists (archives source) et des wheels (binaires pré-compilés)
Vous pouvez publier sur PyPi avec twine, en utilisant des tokens pour l’authentification
Vous avez créé une recette conda pour toucher l’écosystème scientifique
Vous pouvez publier sur anaconda avec anaconda-client
Et tout ça est intégré dans pixi avec des features et des tâches
Dans la dernière partie, on automatisera tout ce processus : à chaque nouvelle release sur GitHub, les packages seront construits et publiés automatiquement. Plus besoin de lancer les commandes à la main !