Faire un paquetage en python
Autant le dire tout de suite, ça parait simple, ça l’est mais quand vous cherchez ou demandez personne ne fait pareil. Du coup, la première fois c’est une galère totale. Voici l’arborescence d’un de mes programmes :
|
|
Explications
Les répertoires
- cfg Dans ce répertoire, je mets mes fichiers de config qui seront placés à plusieurs endroits du système.
- Imagesat Dans ce répertoire qui porte le même nom que mon programme, je mets toutes les dépendances de mon programme qui iront se placer dans /usr/lib/pythonX.Y/site-packages/. Ce répertoire est inclu dans le path de python ce qui vous garanti que votre application retrouvera ses petits au lancement. Pourquoi dans ce répertoire ? C’est tout simple. Par exemple, lors d’une mise à jour de python, de la v3.3 à la v3.4, vous n’aurez pas besoin de réinstaller votre programme. Tout ce qui se trouve dans /usr/lib/pythonX.Y/site-packages/ sera «transféré» dans /usr/lib/pythonX.(Y+1)/site-packages/
Les fichiers
init.py Je vous le donne en brut et je fais les explications ensuite :
|
|
Lignes 1 à 13
Elles se passent de commentaire.
Ligne 14
Attention, il faut mettre le nom du futur paquetage !
Lignes 15 à 16
Elles se passent de commentaire là aussi
Lignes 18 à 22
Afin de faire des vérifications (voir la dernière partie), j’inclus tout ce qui sert dans mon programme principal :
- Fonctions
- Classes
- …
Pensez bien à mettre le . pour indiqué que ce que vous voulez inclure se trouve à partir du répertoire courant.
AUTHORS
Je pense que vous l’aurez deviné, j’y mets le nom des personnes ayant participé au projet.
CHANGELOG
J’y mets les changements que j’apporte au programme
imagesat
C’est «l’exécutable», celui qui sera placé dans /usr/bin
INSTALL
J’y décris la/les procédure(s) d’installation.
LICENSE
J’y mets sous quelle licence est distribué mon programme.
MANIFEST.in
Ce fichier est important. Au moment de la construction du paquetage, il permet de lister les fichiers que vous souhaitez y mettre. J’utilise 2 commandes :
- include nom_du_fichier
- recursive-include nom_du_rep joker
La première permet d’inclure des fichiers un par un alors que la seconde permet de le faire de manière récursive. Voici un exemple :
|
|
Si je ne veux prendre que les fichiers .py du répertoire Imagesat, je mets :
|
|
Pour plus d’informations, je vous renvoie sur la doc python
README.rst
Ce fichier me permet d’expliquer à quoi sert mon programme. C’est une reprise du fichier INSTALL en un peu plus détaillé. Il peut être au format md (MarkDown) ou rst (ReStructuredText). Je ne l’ai pas changé mais ma préférence se porte sur le .md
setup.py
C’est le fichier le plus important puisque c’est lui qui permet la création du paquetage. Je vous le donne en brut et je fais les explications ensuite :
|
|
Lignes 1 à 10
Je les passe sous silence 😉
Lignes 11 à 14
Ici, j’importe des lib qui me seront utiles quelques lignes plus bas. La ligne 14 importe Imagesat, ce qui aura pour effet de charger le fichier init.py vu plus haut. Cette inclusion nous assure qu’il n’y aura pas d’effet de bord.
Lignes 18 à 27
Les CLASSIFIERS vous permettent de classer votre programme selon certains critères. Vous trouverez votre bonheur à cette adresse.
Lignes 29 à 30
Dans DATA_FILES, je vais ranger tout ce qui aura besoin d’être dans un répertoire spécifique différent de /usr/lib/pythonX.Y/site-packages/. La déclaration se fait comme ceci :
|
|
Ligne 32
Vous y mettez vos futurs exécutable. Après installation, vous le trouverez dans /usr/bin/ sous GNU/Linux.
Lignes 34 à 50
C’est le gros du morceau ! Le but est de transmettre les informations nécessaires à la création du paquetage via la fonction setup(). Vous trouverez une liste exhaustive de ce qu’il est possible de mettre à cette adresse qui est la pep 0314.
Finalisation
Bon, nous y sommes ! Sauf qu’il serait quand même sympathique de pouvoir vérifier tout ça. Tout a été bien pensé, ne vous inquiétez pas. En console, lancez la commande :
|
|
Si vous n’avez pas running check, pas la peine d’aller plus loin. Corrigez vos erreurs !