Ubuntu logo

Packaging Guide

12. Empaquetage de modules et d’applications Python

Nos empaquetages suivent la Charte Python de Debian. Nous allons utiliser le paquet python-markdown comme un exemple, qui peut être téléchargé à partir de PyPI. Vous pouvez examiner son empaquetage dans son dépôt Subversion.

Il existe deux types de paquets Python — modules et apps.

Au moment d’écrire ces lignes, Ubuntu dispose de deux versions incompatibles de Python 2.x et 3.x. /usr/bin/python est un lien symbolique vers une version par défaut de Python 2.x, et /usr/bin/python3 vers une version par défaut de Python 3.x. Les modules Python devraient être construits pour toutes les versions de Python prises en charge.

Si vous vous apprêtez à empaqueter un nouveau module Python, vous pourriez trouver l’outil py2dsc très utile (disponible dans le paquet python-stdeb).

12.1. debian/control

Les versions Python 2.x et 3.x du paquet doivent se trouver en paquets binaires séparés. Les noms doivent être formatés en python{,3}-nomdemodule (comme : python3-dbus.mainloop.qt). Ici, nous allons utiliser python-markdown et python3-markdown pour les paquets de module et python-markdown-doc pour la documentation du paquet.

Les choses de debian/control spécifiques à un paquet Python :

  • La section des paquets de module doit être python, et doc pour les paquets de documentation. Pour une application, un simple paquet binaire suffira.

  • Il convient d’ajouter les dépendances de construction sur python-all (>= 2.6.6-3~) et python3-all (>= 3.1.2-7~) pour s’assurer que les aides Python sont disponibles (voir la section suivante pour plus de détails).

  • Il est recommandé d’ajouter les champs X-Python-Version et X-python3-version — voir la section “Spécification des Versions Prises en Charge”de la charte pour des détails. Par exemple :

    X-Python-Version: >= 2.6
    X-Python3-Version: >= 3.1

    Si votre paquet fonctionne seulement avec Python 2.x ou 3.x, la compilation dépend seulement d’un paquet -all et n’utilisez qu’un seul champ -Version.

  • Les paquets de modules doivent avoir les variables de substitution {python:Depends} et `` {python3:Depends}`` (respectivement) dans leurs listes de dépendances.

12.2. debian/rules

Les aides recommandées pour les modules python sont dh_python2 et dh_python3. Malheureusement, debhelper ne compile pas encore automatiquement des paquets Python 3.x (voir le bogue 597105 dans le Système de Traçage de Bogues Debian), de sorte que nous aurons besoin de le faire manuellement dans les sections de remplacement (les sauter si votre paquet ne prend pas en charge Python 3.x).

Voici notre fichier debian/rules (avec annotations) :

# These commands build the list of supported Python 3 versions
# The last version should be just “python3” so that the scripts
# get a correct shebang.
# Use just “PYTHON3 := $(shell py3versions -r)” if your package
# doesn’t contain scripts
PY3REQUESTED := $(shell py3versions -r)
PY3DEFAULT := $(shell py3versions -d)
PYTHON3 := $(filter-out $(PY3DEFAULT),$(PY3REQUESTED)) python3

%:
    # Adding the required helpers
    dh $@ --with python2,python3

override_dh_auto_clean:
    dh_auto_clean
    rm -rf build/

override_dh_auto_build:
    # Build for each Python 3 version
    set -ex; for python in $(PYTHON3); do \
        $$python setup.py build; \
    done
    dh_auto_build

override_dh_auto_install:
    # The same for install; note the --install-layout=deb option
    set -ex; for python in $(PYTHON3); do \
        $$python setup.py install --install-layout=deb --root=debian/tmp; \
    done
    dh_auto_install

C’est également une bonne pratique d’effectuer des tests lors de la construction, si ils sont fournis par l’amont. Habituellement, les tests peuvent être appelés à l’aide de setup.py test ou setup.py check.

12.3. debian/*.install

Les modules Python 2.x sont installés dans le répertoire /usr/share/pyshared/, et les liens symboliques sont créés dans /usr/lib/python2.x/dist-packages/ pour chaque version d’interpréteur, alors que ceux de Python 3.x sont tous installés dans /usr/lib/python3/dist-packages/.

Si votre paquet est une application et possède des modules Python privés, ils doivent être installés dans /usr/share/module, ou ``/usr/lib/module``si ces modules sont dépendants de l’architecture (par exemple, des extensions) (voir le paragraphe « Programmes fournissant des Modules Privés » de la Charte).

Ainsi, notre fichier python-markdown.install devrait ressembler à ceci (nous voulons aussi installer un markdown_py exécutable) :

usr/lib/python2.*/
usr/bin/

et python3-markdown.install comportera une seule ligne :

usr/lib/python3/

12.4. Le paquet -doc

L’outil le plus couramment utilisé pour la construction des documentations Python est Sphinx. Pour ajouter la documentation Sphinx à votre paquet (en utilisant l’aide dh_sphinxdoc), vous devez :

  • Ajouter à votre compilation une dépendance à python-sphinx ou python3-sphinx (selon la version de Python souhaitée) ;

  • Annexer sphinxdoc à la ligne dh --with ;

  • Lancer setup.py build_sphinx dans override_dh_auto_build (pas toujours nécessaire) ;

  • Ajouter {sphinxdoc:Depends} à la liste des dépendances de votre paquet -doc;

  • Ajouter le chemin du répertoire des documents intégrés (généralement build/sphinx/html) à votre fichier .docs.

Dans notre cas, les documents sont créés automatiquement dans le répertoire build/docs/ lorsque nous exécutons setup.py build, ainsi nous pouvons simplement les mettre dans le fichier python-markdown-doc.docs :

build/docs/

En raison de la présence de fichiers source .txt dans docs, nous allons aussi dire à dh_compress de ne pas les compresser — en ajoutant cela à debian/rules :

override_dh_compress:
    dh_compress -X.txt

12.5. Vérification des erreurs d’empaquetage

Avec lintian, il existe un outil spécifique pour vérifier les paquets Python —  lintian4py. Il est disponible dans le paquet lintian4python. Par exemple, ces deux commandes invoquent les deux versions de lintian et vérifient les paquets sources et binaires :

lintian -EI --pedantic *.dsc *.deb
lintian4py -EI --pedantic *.dsc *.deb

Ici, l’option -EI est utilisée pour activer les balises expérimentales et informatives.

12.6. Voir aussi