Différences entre distribution, distutils, setuptools et distutils2?

594

La situation

J'essaie de porter une bibliothèque open-source sur Python 3. ( SymPy , si quelqu'un se demande.)

Donc, je dois exécuter 2to3automatiquement lors de la construction pour Python 3. Pour ce faire, je dois utiliser distribute. Par conséquent, je dois porter le système actuel, qui (selon le docteur) est distutils.


Le problème

Malheureusement, je ne suis pas sûr quelle est la différence entre ces Modules- distutils, distribute, setuptools. La documentation est aussi sommaire que possible, car elles semblent toutes être une fourchette les unes des autres, destinées à être compatibles dans la plupart des cas (mais en fait, pas toutes)… et ainsi de suite, etc.


La question

Quelqu'un pourrait-il expliquer les différences? Que dois-je utiliser? Quelle est la solution la plus moderne? (En passant Distribute, j'apprécierais également un guide sur le portage , mais c'est un peu au-delà de la portée de la question ...)

VPeric
la source
22
Comment déroutant? Je suis venu en python à partir d'un arrière-plan Java / C ++. Dans ces situations, la distribution est très simple. Avec python, je suis complètement confus concernant tous ces systèmes de distribution.
Raffi Khatchadourian
75
Je suis d'accord, l'emballage / l'installation Python a beaucoup trop d'alternatives sans conseils clairs de la communauté.
Sabuncu
6
Je voulais juste lier cette information connexe sur pip ne prenant pas en charge les distributions binaires lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat
@pixelbeat pip prend en charge l'installation de roues (dites distributions binaires), ce lien est obsolète.
Flimm

Réponses:

836

En mars 2020, la plupart des autres réponses à cette question étaient obsolètes depuis plusieurs années. Lorsque vous rencontrez des conseils sur les problèmes de packaging Python, n'oubliez pas de regarder la date de publication et ne vous fiez pas aux informations obsolètes.

Le Guide de l'utilisateur de Python Packaging mérite d'être lu. Chaque page a une date de «dernière mise à jour» affichée, vous pouvez donc vérifier la récence du manuel, et il est assez complet. Le fait qu'il soit hébergé sur un sous-domaine de python.org de la Python Software Foundation ne fait qu'ajouter de la crédibilité. La page Résumés du projet est particulièrement pertinente ici.

Résumé des outils:

Voici un résumé du paysage de l'emballage Python:

Outils pris en charge:

Outils obsolètes / abandonnés:

  • distributeétait une fourchette de setuptools. Il partageait le même espace de noms, donc si vous aviez installé Distribute, import setuptoolsimporterait en fait le package distribué avec Distribute. Distribute a été fusionné dans Setuptools 0.7 , vous n'avez donc plus besoin d'utiliser Distribute. En fait, la version sur Pypi n'est qu'une couche de compatibilité qui installe Setuptools.

  • distutils2était une tentative de tirer le meilleur parti de distutils, setuptoolset de distributedevenir l'outil standard inclus dans la bibliothèque standard de Python. L'idée était qu'elle distutils2serait distribuée pour les anciennes versions de Python, et qu'elle distutils2serait renommée packagingpour Python 3.3, qui l'inclurait dans sa bibliothèque standard. Cependant, ces plans ne se sont pas déroulés comme prévu et il distutils2s'agit actuellement d' un projet abandonné . La dernière version date de mars 2012 et sa page d'accueil Pypi a finalement été mise à jour pour refléter sa mort.

Autres:

Il existe d'autres outils, si vous êtes intéressé, lisez les résumés des projets dans le Guide de l'utilisateur de Python Packaging. Je ne vais pas les énumérer tous, de ne pas répéter cette page, et de garder la réponse correspondant à la question, qui était seulement distribute, distutils, setuptoolset distutils2.

Recommandation:

Si tout cela est nouveau pour vous et que vous ne savez pas par où commencer, je recommanderais d'apprendresetuptools , avec pipet virtualenv, qui fonctionnent tous très bien ensemble.

Si vous êtes à la recherche dans virtualenv, vous pourriez être intéressé par cette question: Quelle est la différence entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, etc? . (Oui, je sais, je gémis avec toi.)

Flimm
la source
2
@makeramen: Voir ce fil sur la liste de diffusion .
Flimm
6
Et ce n'est pas mieux: 'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI Distribute page.
KurzedMetal
3
@KurzedMetal, selon les gens de SetupTools, setuptools 0.7 subsume à la fois la distribution et l'ancien ordre de restauration de setuptools dans l'univers. Les choses devraient donc s'améliorer considérablement!
John McDonnell
8
Le Guide de l'utilisateur de l'emballage Python contiendra les informations les plus récentes sur l'état de l'emballage python. Il a été noté par Nick Coughlan au PyCon 2013 .
imanuelcostigan
1
@Flimm La dernière édition remonte à un certain temps. Bento est-il mature maintenant?
Martin Thoma
251

Je suis mainteneur distutils et contributeur distutils2 / packaging. J'ai parlé du packaging Python à ConFoo 2011 et ces jours-ci j'en écris une version étendue. Ce n'est pas encore publié, voici donc des extraits qui devraient aider à définir les choses.

  • Distutils est l'outil standard utilisé pour l'emballage. Il fonctionne plutôt bien pour des besoins simples, mais est limité et n'est pas trivial à étendre.

  • Setuptools est un projet né du désir de combler les fonctionnalités manquantes des distutils et d'explorer de nouvelles directions. Dans certaines sous-communautés, c'est une norme de facto . Il utilise le patch de singe et la magie qui sont désapprouvés par les développeurs principaux de Python.

  • Distribuer est un fork de Setuptools qui a été lancé par des développeurs estimant que son rythme de développement était trop lent et qu'il n'était pas possible de le faire évoluer. Son développement a été considérablement ralenti lorsque distutils2 a été lancé par le même groupe. Mise à jour 2013-août: la distribution est réintégrée dans setuptools et arrêtée.

  • Distutils2 est une nouvelle bibliothèque distutils, démarrée comme un fork de la base de code distutils, avec de bonnes idées tirées des outils de configuration (dont certains ont été discutés en détail dans les PEP), et un installateur de base inspiré de pip. Le nom réel que vous utilisez pour importer Distutils2 se trouve packagingdans la bibliothèque standard Python 3.3+, ou distutils2dans 2.4+ et 3.1–3.2. (Un backport sera bientôt disponible.) Distutils2 n'a pas fait la version Python 3.3, et elle a été mise en attente.

Plus d'informations:

J'espère terminer mon guide bientôt, il contiendra plus d'informations sur les points forts et les points faibles de chaque bibliothèque et un guide de transition.

Éric Araujo
la source
1
Distutils2 prend quelques bonnes idées de setuptools / distribuer, après normalisation (PEP) ou non (par exemple, je conseille un étudiant GSoC qui ajoute une commande de développement et la génération automatique de scripts), mais ce ne sera jamais un drop-in remplacement: il y a des pièces que nous ne voulons pas (oeufs, intégration VCS, etc.). OTOH, distutils2 a certaines choses que setuptools / distribue n'ont pas. Pour faciliter la transition, je pense que les développeurs de distribution utiliseront peut-être distutils2 pour prendre en charge de nouveaux standards et outils; Je pense aussi que je me souviens que le développeur de setuptools a dit qu'il voulait supporter de nouvelles normes.
Éric Araujo
1
Où se situe ez_setup dans tout cela? Y a-t-il également des mises à jour du statut de distutils2?
James McMahon
2
@ ÉricAraujo Désolé d'entendre parler du retard. J'espère vraiment qu'il est prêt à temps pour la 3.4! J'adore Python, mais l'emballage m'a toujours fait me cogne la tête contre le mur. (Dans d'autres nouvelles, comment va votre guide? S'il est terminé, pourriez-vous le lier dans votre réponse ci-dessus?)
Zearin
9
@AlexisHuet Ce type de commentaire serait mieux s'il contenait le lien vers le commentaire ci-dessous (que vous pouvez obtenir à partir du sharebouton).
erikbwork
2
vous devriez peut-être mettre à jour la réponse pour mentionner qu'elle distributea récemment été réintégrée setuptools. Le fait qu'une grande partie des informations disponibles soit obsolète ajoute à la confusion
Amro
5

REMARQUE: réponse obsolète, la distribution est désormais obsolète. Cette réponse n'est plus valable depuis la création de la Python Packaging Authority et a fait beaucoup de travail de nettoyage.


Oui, vous l'avez. : -o Je pense qu'à l'heure actuelle, le package préféré est Distribute , qui est un fork de setuptools, qui sont une extension de distutils (le système d'emballage d'origine). Setuptools n'était pas maintenu, il a donc été bifurqué et renommé, mais une fois installé, il utilise le nom de package de setuptools! Je pense que la plupart des développeurs Python utilisent maintenant Distribute, et je peux dire avec certitude que je le fais.

Keith
la source
Pour mémoire, j'ai accepté cette réponse parce qu'elle me disait la situation maintenant (et la fourchette est l'extension de relation que l'image dans l'autre réponse ne mentionne tout simplement pas). Et quelque part sur la route, j'ai également appris que la documentation elle-même n'est généralement pas sûre de ce qu'elle essaie de dire.
VPeric
2
@VPeric, En effet, la documentation reflète le fait que cet aspect de python est dans un état de flux / désordre.
juanchopanza
2

Je me rends compte que j'ai répondu à votre question secondaire sans répondre à des hypothèses incontestées dans votre problème d'origine:

J'essaie de porter une bibliothèque open source (SymPy, si quelqu'un se demande) sur Python 3. Pour ce faire, j'ai besoin d'exécuter 2to3 automatiquement lors de la construction pour Python 3.

Vous mai , pas besoin . D'autres stratégies sont décrites sur http://docs.python.org/dev/howto/pyporting

Pour ce faire, je dois utiliser distribuer,

Vous pouvez :) distutils prend en charge la conversion 2to3 au moment de la construction pour le code (pas les docstrings), d'une manière différente qui distribue celle-ci: http://docs.python.org/dev/howto/pyporting#during-installation

Éric Araujo
la source
Merci, bien que nous ayons déjà décidé de résoudre le problème en écrivant notre script pour gérer la conversion. Et oui, je savais qu'il y avait d'autres options que d'utiliser 2to3, mais SymPy est une base de code complexe (environ 200k + lignes la dernière fois que j'ai vérifié) et utiliser 2to3 était la seule stratégie réaliste. Merci encore, en tout cas!
VPeric
2

Mise à jour de cette question fin 2014 où, heureusement, le chaos de l'emballage Python a été considérablement nettoyé par le gestionnaire de paquets " conda " de Continuum .

En particulier, conda permet rapidement la création d '" environnements " conda . Vous pouvez configurer vos environnements avec différentes versions de Python. Par exemple:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

créera deux environnements ("py34" ou "py26") Python avec différentes versions de Python.

Ensuite, vous pouvez invoquer l'environnement avec la version spécifique de Python avec:

source activate <env name>

Cette fonctionnalité semble particulièrement utile dans votre cas où vous devez gérer différentes versions de Python.

De plus, conda a les caractéristiques suivantes:

  • Python agnostique
  • Plateforme croisée
  • Aucun privilège administrateur requis
  • Gestion intelligente des dépendances (via un solveur SAT)
  • Traite bien les bibliothèques de niveau C, Fortran et système que vous devrez peut-être lier

Ce dernier point est particulièrement important si vous êtes dans le domaine du calcul scientifique.

Julien Chastang
la source