Microclub

Boite à outils Python : PyPI, virtualenv, Git SVN Hg, Goulib

setuptools est un outil Python qui n’a (à ma connaissance) aucun équivalent dans l’autres langages : il permet de télécharger des librairies du web, avec toutes leurs dépendances et de les installer, le tout automatiquement .

Après l’avoir installé il suffit par exemple de lancer « easy_install Goulib » depuis une ligne de commande pour incorporer toutes un certain nombre des fonctions Python que j’ai développé ces dernières années à votre propre librairie et les utiliser dans vos propres programmes. Et si vous n’y trouvez pas votre bonheur, il y a environ 24000 autres « packages » disponibles sur « PyPI », le « Python Package Index » dans lequel easy_install.exe va chercher les librairies.

Mais je ne vais pas détailler ici ma librairie, il y aura une doc pour ça un de ces jours… Dans cet article je vais plutôt expliquer ce qu’il faut mettre en place pour diffuser des projets opensource sur le web, et éventuellement permettre à d’autres de corriger vos bugs.

Tout sur PyPI

Pour mettre à disposition un package sur PyPI, il suffit de suivre ces instructions:

  1. organiser la structure des répertoires ainsi (je prends Goulib comme exemple):
    Goulib/
        CHANGES.txt
        docs/
        LICENSE.txt
        README.txt
        MANIFEST.in
        setup.py
        Goulib/
            __init__.py
            les_fichiers_source.py
  2. où:
    • CHANGES.txt contiendra la liste des changements à chaque version, il peut donc être vide au début
    • LICENSE.txt doit contenir le texte légal de la licence de diffusion du code. Pour ma part j’utilise la LGPL dont le texte est ici
    • README.txt contient le texte qui sera affiché sur la page PyPI de la lib au format pandoc ou  ReStructuredText. Par exemple mon README.txt produit cette page
    • le MANIFEST.in est un template permet d’ajouter des fichiers à la distribution, les fichiers.py et d’autresétant inclus par défaut. Le fichier minimal contient:
      include *.txt
      recursive-include docs *.txt

      pour que les fichiers .txt sus-mentionnés ainsi que ceux qui se trouveraient dans le dossier docs soient inclus

    • enfin, setup.py est le fichier qui décrit tout le package:
      from distutils.core import setup
      
      setup(
          name='Goulib',
          version='1.0.0',
          author='Philippe Guglielmetti',
          author_email='goulib@goulu.net',
          packages=['Goulib'],
          scripts=[],
          url='http://pypi.python.org/pypi/Goulib/',
          license='LICENSE.txt',
          description='My Python library.',
          long_description=open('README.txt').read(),
          install_requires=[],
      )

      le « install_requires » est une liste vide dans mon cas car Goulib ne requiert aucune autre librairie à part la librairie Python standard installée avec Python. Mais si le package nécessite au moins la version 1.1.1 de Django et caldav précisément à la version 0.1.4, on peut spécifier:

      install_requires=[
              "Django >= 1.1.1",
              "caldav == 0.1.4",
          ],

      et ces packages (et toutes leurs propres dépendances…) seront téléchargées et installées automatiquement au besoin (c’est beau !)

  3. ensuite, la commande « python setup.py sdist » préparera tout ce qu’il faut et le comprimera dans un fichier .zip placé dans un sous-répertoire « dist »
  4. enfin, il faut créer un compte sur PyPI et faire « python setup.py register » pour y enregistrer le nouveau package puis « python setup.py sdist upload » pour y uploader le package et le rendre disponible à tous les Pythonistes

Il me faut un virtualenv

Oui mais si j’ai un projet qui a besoin d’une certaine version d’un package et un autre projet qui a besoin d’une autre version du même package ? Et si je veux commencer un nouveau projet avec Python 3.3 alors que j’ai toujours besoin de Python 2.7 pour le vieux ?

Microsoft résout ça en remplissant votre PC avec les .dll de toutes les versions sous toutes les versions de .NET, alors que fait ça bien avec virtualenv. Comme c’est un package PyPI, on l’installe en faisant « easy_install virtualenv« .

Ensuite quand on a besoin d’un environnement Python différent, on fait « python virtualenv.py ENV » où ENV est le nom du projet ou de l’environnement qu’on veut créer. Ca créer une structure de dossiers comme celle-ci:

ENV/
    Include/
    Lib/
    Scripts/
  • Dans « Include » il y a plein de fichiers .h dont Python a besoin je ne sais pas (encore) pourquoi
  • Dans « Lib » il y a la librairie standard de Python, et rien qu’elle pour l’instant
  • Dans « Scripts » il y a:
    • une copie de l’interpréteur Python.exe courant, par défaut celui que vous avez installé en dernier sur votre machine
    • « activate.bat » qui lorsqu’il est lançé, ajuste les variables d’environnement pour utiliser cette copie de l’interpréteur Python et la librairie qui se trouve dans Lib plutôt que celle par défaut
    • « deactivate.bat » qui remet tout en ordre
    • pip, un remplacement du « easy_install » mentionné au début de cet article. Pip installe les packages dans l’environnement activé plus proprement qu’easy_install.
En fait, oubliez easy_install

Voilà, vous avez compris : lancez activate.bat, puis faites « pip Goulib » pour installer votre librairie préférée seulement où il y en a besoin. En prime, absolument tous les fichiers nécessaires à un projet sont réunis dans le dossier ENV, y compris l’exécutable du langage. Il suffit d’archiver tout ça pour pouvoir récupérer et faire tourner le programme sur une autre machine, ou dans très longtemps comme l’exigent les employeurs sensés.

A plusieurs, c’est mieux

Avec tout ça le monde entier peut bénéficier de votre code, mais votre code ne peut pas bénéficier du monde entier. Il existe plusieurs sites permettant le travail collaboratif, dont les plus connus sont  Sourceforge.net, Bitbucket.orgGitHub.com et Google Code. Ces sites utilisent un ou plusieurs des 3 logiciels de « gestion de versions » à la mode:

  • Subversion, SVN pour les intimes. Relativement ancien, il est apprécié des entreprises en particulier car c’est un système centralisé : tout le code de la boite est à un endroit précis. En plus, Tortoise SVN rend SVN très utilisable sous Windows avec des menus contextuels et de jolies icônes indiquant le statut des fichiers
  • Git a le vent en poupe sur le web. C’est à la base un système de gestion de fichiers décentralisés, j’ai pas encore vraiment tout compris comment ça marche, mais comme j’ai décidé de l’utiliser, ça viendra. D’autant qu’en écrivant cet article je découvre Tortoise GIT !
  • Mercurial, Hg pour les chimistes, est le petit dernier qui monte. Il est encore plus décentralisé que Git car il n’a même plus besoin de serveur. Et il est écrit en Python. Et ya aussi un Tortoise Hg !

Ya plus qu’à choisir… ou tout choisir !  Il n’y a que la centralisation de Subversion qui empêche de publier le code sur plus d’un « repository », alors j’ai choisi sourceforge. Pour Git, j’ai carrément configuré les 4 sites comme autant de repository et mon code est sur sur sourceforgesur bitbucket et sur code.google.comSur github j’ai encore un petit problème que je ne comprends pas bien, mais ça va aller…

Voilà, maintenant les développeurs du monde entier, vous y compris, qu’ils soient accros au shell linux ou utilisateurs d’un Tortoise peuvent télécharger le code source de Goulib, le corriger et le compléter, et soumettre automatiquement leurs modifs sur le site de leur choix. Ce sera toujours à moi de fusionner leurs contributions et de produire de nouvelles versions sur PyPI pour les utilisateurs finaux.

Une fois que vous aurez compris comment ça marche dans ce cas tout simple, vous pourrez collaborer de façon efficace à des projets open source de plus en plus grands, en finissant par Python (géré sous Mercurial) , Apache (sous SVN) ou Linux (sous Git)

2 réflexions sur “Boite à outils Python : PyPI, virtualenv, Git SVN Hg, Goulib

  • Ca me donne envie de prendre le temps de distribuer le code python de ma thèse sur Pypi. A tout hasard, est-ce que le Dr Goulu sait si c’est possible d’inclure des du code c++ dans un package Pypi ?

    • oui, c’est possible. Pour le source pas de problème : il suffit d’ajouter « include recursive src *.h *.cpp » dans le MANIFEST.in . Idem si tu as des *.dll ou *.lib appellées depuis Python.
      Mais si tu veux que le code soit compilé sur la machine qui downloade ta lib (Fenêtre, Pomme ou Pingouin), alors je sais pas faire. Mais ça doit être possible, parce que certaines libs comme http://pypi.python.org/pypi/numpy/ le font. Essaie et dis nous !

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.