Packager votre code

Packagez votre code pour le partager avec d’autres développeurs. Par exemple, pour partager une bibliothèque pour que d’autres développeurs l’utilise dans leur application, ou pour les outils de développement comme ‘py.test’.

Un avantage de cette méthode de distribution est son écosystème bien établi d’outils tels que PyPI et pip, qui rendent facile pour d’autres développeurs de télécharger et d’installer votre paquet soit pour des expérimentations occasionnelles, ou comme un morceau de grands systèmes professionnels.

C’est une convention bien établie pour le code Python d’être partagé de cette façon. Si votre code n’est pas packagé sur PyPI, alors il sera plus difficile pour les autres développeurs de le trouver, et de l’utiliser dans le cadre de leur processus existant. Ils vont considérer de tels projets avec la suspicion importante qu’il soit mal géré ou abandonné.

L’inconvénient de la distribution de code comme ceci est qu’il repose sur le fait que le destinataire comprenne comment installer la version requise de Python, et soit en mesure et désireux d’utiliser des outils tels que pip pour installer les autres dépendances de votre code. C’est bien quand la distribution est pour les autres développeurs, mais rend cette méthode inadaptée pour la distribution d’applications à des utilisateurs finaux.

Le Python Packaging Guide fournit un guide complet sur la création et la maintenance des paquets Python.

Alternatives au packaging

Pour distribuer des applications à des utilisateurs finaux, vous devriez geler votre application.

Sous Linux, vous pouvez également envisager de créer un paquet de distribution Linux (c’est à dire des fichiers .deb pour Debian ou Ubuntu.)

Pour les développeurs Python

Si vous écrivez un module Python open source, PyPI , plus connu comme le Cheeseshop (magasin de fromages), est l’emplacement où l’héberger.

Pip vs. easy_install

Utilisez pip. Plus de détails ici

PyPi personnel

Si vous voulez installer des paquets à partir d’une autre source que PyPI, (par exemple, si vos paquets sont propriétaires), vous pouvez le faire hébergeant un simple serveur http, s’exécutant à partir du répertoire qui contient les paquets qui doivent être installés.

Montrer un exemple est toujours bénéfique

Par exemple, si vous souhaitez installer un paquet appelé MyPackage.tar.gz, et en supposant que c’est votre structure de répertoire:

  • archive
    • MyPackage
      • MyPackage.tar.gz

Allez à votre invite de commande et tapez:

$ cd archive
$ python -m SimpleHTTPServer 9000

Cela exécute un simple serveur http, fonctionnant sur le port 9000 et listera tous les paquets (comme MyPackage). Maintenant, vous pouvez installer MyPackage en utilisant n’importe quel installateur de paquets Python. En utilisant Pip, vous devriez le faire avec:

$ pip install --extra-index-url=http://127.0.0.1:9000/ MyPackage

Avoir un dossier avec le même nom que le nom du package est cruciale ici. J’ai été trompé par cela, une seule fois. Mais si vous avez l’impression que créer un dossier appelé MyPackage et garder un fichier MyPackage.tar.gz dedans est redondant, vous pouvez toujours installer MyPackage en utilisant:

$ pip install  http://127.0.0.1:9000/MyPackage.tar.gz

pypiserver

Pypiserver est un serveur minimal compatible avec PyPi. Il peut être utilisé pour servir un jeu de paquets pour easy_install ou pip. Il inclue des fonctionnalités utiles comme une commande administrative (-U) qui mettra à jour tous ses paquets à leurs dernières versions trouvées sur PyPI.

PyPi hébergé sur S3

Une option simple pour un serveur PyPI personnel est d’utiliser Amazon S3. Un prérequis pour cela est que vous ayez un compte Amazon AWS avec un bucket S3.

  1. Installer tous vos requirements depuis PyPi ou une autre source

  2. Installer pip2pi

  • pip install git+https://github.com/wolever/pip2pi.git
  1. Suivre le README pip2pi pour les commandes de pip2tgz et dir2pi

  • pip2tgz packages/ MyPackage (ou pip2tgz packages/ -r requirements.txt)

  • dir2pi packages/
  1. Uploader les nouveaux fichiers

  • Utilisez un client comme Cyberduck pour synchroniser l’ensemble du dossier packages avec votre bucket s3

  • Assurez-vous que vous uploadez packages/simple/index.html ainsi que tous les nouveaux fichiers et répertoires.

  1. Corriger les nouvelles permissions du fichier

  • Par défaut, lorsque vous uploadez de nouveaux fichiers dans le bucket S3, ils auront les mauvaises permissions définies.

  • Utilisez la console web Amazon pour définir l’autorisation READ des fichiers à EVERYONE.

  • Si vous avez un code HTTP 403 lorsque vous essayez d’installer un paquet, assurez-vous que vous avez configuré correctement les permissions.

  1. Terminé

  • Vous pouvez maintenant installer votre paquet avec pip install --index-url=http://your-s3-bucket/packages/simple/ MyPackage

Pour les distribution Linux

Créer un paquet pour distribution Linux est sans doute la “bonne manière” de distribuer votre code sous Linux.

Parce qu’un paquet de distribution n’inclue pas l’interpréteur Python, il rend le téléchargement et l’installation environ 2MB plus petit que le gel de votre application.

En outre, si une distribution met à disposition une nouvelle mise à jour de sécurité pour Python, votre application commencera automatiquement à utiliser cette nouvelle version de Python.

La commande bdist_rpm rend triviale la production d’un fichier RPM pour l’utilisation par des distributions comme Red Hat ou SuSE.

Cependant, créer et maintenir les différentes configurations requises pour chaque format de distribution (par exemple .deb pour Debian/Ubuntu, .rpm pour Red Hat/Fedora, etc) est une bonne quantité de travail. Si votre code est une application que vous envisagez de distribuer sur d’autres plates-formes, alors vous aurez également à créer et maintenir la configuration séparée nécessaire pour geler votre application pour Windows et OSX. Ce serait beaucoup moins de travail de simplement créer et maintenir une seule configuration pour un des outils de freezing multi-plateformes, qui va produire des exécutables autonomes pour toutes les distributions de Linux, ainsi que Windows et OSX.

Créer un paquet de distribution est également problématique si votre code est pour une version de Python qui n’est pas supportée par une distribution. Avoir à dire à des utilisateurs finaux de certaines versions d’Ubuntu qu’ils ont besoin d’ajouter le PPA ‘dead-snakes’ en utilisant la commande sudo apt-repository avant de pouvoir installer votre fichier .deb rend l’expérience hostile à l’utilisateur. Non seulement cela, mais vous auriez à maintenir un équivalent personnalisé de ces instructions pour chaque distribution, et pire encore, à demander à vos utilisateurs de lire, de comprendre et d’agir sur eux.

Cela dit, voici comment faire:

Outils utiles