Skip to article frontmatterSkip to article content

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

  • sdist crée une archive de votre package.

    Lorsqu’un utilisateur utilise pip pour l’installer, l’archive est téléchargée puis la commande pip install est exécutée comme vu précédemment. La ligne de commande

    python -m build --sdist

    crée une archive dans le répertoire dist.

  • bdist cré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é wheels et est obtenu à partir de la ligne de commande

    python -m build --wheel

    Il existe plusieurs variantes :

    1. Lorsque le package ne contient que des fichiers Python.

      On a alors dans le répertoire dist le fichier calculator-0.1.1-py3-none-any.whl.

    2. Lorsque le package contient des fichiers compilés.

      On a alors dans le répertoire dist le fichier calculator-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

Avant d’utiliser twine, il est nécessaire de se créer un compte

Pour mettre l’ensemble des distributions sur

  • pypi.org

    twine upload dist/*
  • test.pypi.org

    twine upload --repository-url https://test.pypi.org/legacy/ dist/*

Une fois que vous avez effectué l’upload, vous pouvez rechercher votre application

  • pypi.org

    pip search calculator
  • test.pypi.org

    pip search --index https://testpypi.python.org/pypi 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://anaconda.org/).

Il est ensuite nécessaire d’installer différents outils pour pouvoir uploader vos fichiers.

conda install conda-build anaconda-client

Il 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://conda-forge.org/docs/maintainer/00_intro.html.

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.yaml

    Ce 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.sh

    Ce 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.bat

    Ce 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 setup.py install

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 calculator

Uploader 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-client

Vous pouvez maintenant l’uploader.

anaconda upload /home/loic/miniconda3/conda-bld/linux-64/calculator-0.1.1-py36h585410b_0.tar.bz2

Références