Mon premier module sur le CheeseShop
Ça faisais longtemps que je voulais m'y intéresser : la distribution des modules Python est un truc qui m'a toujours paru hyper tordu. Il faut créer un fichier setup.py, il y a des eggs, zc.buildout qui est sensé être mieux que le reste (quel reste ?). Cependant, lors du Pycon 2008, une conférence sur le déploiement d'application Python avait été tenue, et tout ça me semblait très intéressant : création automatisée de l'egg, le fichier setup.py avait l'air d'être relativement simple, il était possible d'envoyer simplement son module sur le Pypi (ou CheeseShop, une base de donnée de modules en Python), et tel que présenté par le conférencier (Tarek Ziade), ça avait l'air plutôt facile.
Bon, au final, après m'être renseigné, c'est toujours un peu flou. J'ai laissé tombé zc.buildout, qui semble être réservé à des applications autrement plus avancées que la simple distribution d'un module, et je me suis porté sur l'écriture d'un fichier setup.py en utilisant les distutils.
Je ne vais pas trop m'avancer sur le sujet, justement parce que c'est encore trop flou. Donc je préviens : il est possible que je raconte nimporte quoi (m'enfin, ça marche alors bon...).
Pour commencer, voici l'arborescence de mon projet :
.
|-- COPYING
|-- README
|-- arprequest
| |-- __init__.py
| `-- arprequest.py
`-- setup.py
- Le fichier COPYING contient la licence du module. C'est pas "techniquement" obligatoire mais c'est vivement conseillé.
- Le fichier README contient une notice d'utilisation du module. J'utilise le contenu de ce fichier pour constituer la description de ma fiche sur le CheeseShop. Il est formaté en ReStructuredText (un langage de balisage léger), ce dernier étant utilisé par le CheeseShop.
- arprequest est le dossier constituant le module en lui même. Il contient le fichier Python qui contient mes classes, et un fichier __init__.py qui sert à indiquer que le dossier est un module (ceci ne sera plus necessaire sous Py3K il me semble). Pour éviter de d'avoir une structure trop profonde pour accéder aux classes, j'ai ajouté dans ce fichier from arprequest import * qui permet d'importer les classes directement dans le module (from arprequest import ArpRequest et pas from arprequest.arprequest import ArpRequest). J'utilise cette "astuce" car je n'ai pas trouvé comment indiquer au setup.py que le module est un seul est unique fichier.
- Enfin, le fichier setup.py que je vais détailler ci-dessous.
Fichier setup.py (je pense que les commentaires seront suffisants) :
from setuptools import setup
import os
# Comme expliqué plus haut, je récupère le contenu du fichier README :
ldesc = open(os.path.join(os.path.dirname(__file__), 'README')).read()
# On appelle juste la fonction setup() avec un certain nombre d'arguments :
setup(
name='arprequest', # Le nom du module
version='0.2a', # La version
description=('A class which send an ARP Request to know if a '
'host is online on local networks'), # Une description courte
long_description=ldesc, # La description un peu plus longue (mon fichier README)
keywords='arp network ethernet', # Des mots clés
author='Antoine Millet', # Le nom de l'auteur
author_email='antoine@inaps-dies-spammers.org', # Je dois vraiment continuer ? :)
license='WTFPL',
packages=['arprequest'], # Les différents modules, c'est ce sur quoi j'ai encore des doutes sur le fonctionnement
url='http://dev.inaps.org/trac/wiki/ArpRequest',
# Des "catégories", la liste est disponible http://pypi.python.org/pypi?%3Aaction=list_classifiers.
classifiers=[
'Topic :: Communications',
'Topic :: System :: Networking',
'Topic :: System :: Networking :: Monitoring',
'Development Status :: 3 - Alpha',
'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
'License :: Public Domain',
'Operating System :: Unix',
'Programming Language :: Python',
],
)
Une fois le fichier setup.py écrit, il faut l'appeler avec un certain nombre d'arguments :
python setup.py sdist
- Créer une archive qui contient les sources du projet.
python setup.py bdist_egg
- Créer un EGG (package python) qui contient le module (les sources C sont compilées).
python setup.py install
- Permet d'installer le module.
python setup.py register
- Enregistre le module sur le CheeseShop.
python setup.py upload
- Envoyer les packages (sources, eggs) sur le CheeseShop.
python setup.py register sdist bdist_egg upload
- Créer une archive des sources, un egg, enregistre le module et envois les packages.
Pour ma part, après l'exécution de cette dernière commande, j'ai eu le plaisir de constater que la page de mon module avait correctement été créée sur le CheeseShop :-).
MAJ : Bon après coup, j'ai trouvé comment définir le contenu du package avec de simples modules Python : il suffit d'utiliser py_modules=['nomdumodule'] à la place de packages=[...]. Ça m'apprendra à lire la doc comme un pied.


Commentaires
Laisser un commentaire