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
:
:

Optionnel.

:

Ne sera pas publiée, elle est utile pour les Gravatars et la modération des commentaires.

:

Vous pouvez utiliser ces marqueurs : a, strong, em, pre, blockquote, abbr, acronym, et code. Les sauts de lignes et les liens sont automatiquement convertis.

:

Ce test permet de vérifier que vous n'êtes pas un (salaud de) robot de spam.


J'utilise Escaline 
!