Question Différences entre distribute, distutils, setuptools et distutils2?


La situation

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

Donc, j'ai besoin de courir 2to3 automatiquement lors de la construction de Python 3. Pour ce faire, je dois utiliser distribute. Par conséquent, je dois porter le système actuel, qui (selon le doctest) est distutils.


Le problème

Malheureusement, je ne suis pas sûr de la différence entre ces modules ...distutils, distribute, setuptools. La documentation est plutôt sommaire, car ils semblent tous être une fourche l'un de l'autre, destinés à être compatibles dans la plupart des circonstances (mais en fait, pas tous) ... et ainsi de suite, et ainsi de suite.


La question

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


552
2018-06-14 13:17


origine


Réponses:


En janvier 2017, toutes les autres réponses à cette question sont périmées depuis au moins deux ans. Lorsque vous trouvez des conseils sur les problèmes de packaging Python, pensez à consulter la date de publication et ne faites pas confiance aux informations obsolètes.

le Guide de l'utilisateur de Python Packaging vaut la peine d'être lu. Chaque page a une date de "dernier examen" affichée, de sorte que vous pouvez 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é. le Résumés de projets la page est particulièrement pertinente ici.

Résumé des outils:

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

Outils supportés:

  • Distutils est toujours l'outil standard pour l'emballage en Python. Il est inclus dans la bibliothèque standard (Python 2 et Python 3.0 à 3.6). Il est utile pour les distributions Python simples, mais manque de fonctionnalités. Il introduit le distutils Package Python pouvant être importé dans votre setup.py scénario.

  • Setuptools a été développé pour surmonter les limites de Distutils et n'est pas inclus dans la bibliothèque standard. Il a introduit un utilitaire de ligne de commande appelé easy_install. Il a également présenté le setuptools Package Python pouvant être importé dans votre setup.py script, et le pkg_resources Package Python pouvant être importé dans votre code pour localiser les fichiers de données installés avec une distribution. Un de ses gotchas est qu'il singe-correctifs le distutils Paquet Python. Cela devrait bien fonctionner avec pip. Il voit des versions régulières.

  • scikit-build est un générateur de système de construction amélioré qui utilise CMake en interne pour construire des extensions Python compilées. Parce que scikit-build n'est pas basé sur distutils, il n'a vraiment aucune de ses limitations. Quand ninja-build est présent, scikit-build peut compiler de gros projets plus de trois fois plus vite que les alternatives. Cela devrait bien fonctionner avec pip. Il voit des versions régulières.

Outils dépréciés / abandonnés:

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

  • Distutils2 était une tentative de prendre le meilleur de Distutils, Setuptools et Distribute et devenir l'outil standard inclus dans la bibliothèque standard de Python. L'idée était que Distutils2 serait distribué pour les anciennes versions de Python, et que Distutils2 serait renommé packaging pour 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 actuellement, Distutils2 est 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.

Logiciel Alpha:

  • Distlib est un outil qui vise à implémenter un sous-ensemble des fonctionnalités des outils précédents, mais uniquement des fonctionnalités très bien définies dans les PEP acceptés. C'est l'un des outils du PyPA (Python Package Authority), et il devrait être éventuellement inclus dans la bibliothèque standard de Python. Il est toujours considéré comme un logiciel alpha, donc attention aux utilisateurs finaux.

  • Il y a un couple plus d'outils (par exemple: Bento), mais je ne les mentionnerai pas car ils sont trop obscurs ou niches ou précoces ou non développés pour ce poste de réponse, ou bien ils ne sont pas des alternatives directes.

Recommandation:

Donc, en conclusion, sur toutes ces options, Je recommanderais Setuptools, sauf si vos exigences sont très basiques et que vous n'avez besoin que de Distutils. Setuptools fonctionne très bien avec Virtualenv et Pip, des outils que je recommande fortement. Virtualenv et Pip pourraient tous deux être considérés comme officiels, car ils font partie de PyPA, et Python 3 est maintenant disponible. ensurepip (qui vous aide à installer pip sur certains systèmes).

Si vous regardez 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 vous.)

En guise de note, je recommande d'utiliser Virtualenv 1.10 ou supérieur, car c'est la première version qui reconnaît la fusion Setuptools / Distribute, pour Python 2 et 3.


783
2018-02-07 14:37



Je suis un mainteneur distutils et distutils2 / contributeur d'emballage. J'ai parlé de l'emballage Python à ConFoo 2011 et je suis en train d'en écrire une version étendue. Ce n'est pas encore publié, alors voici des extraits qui devraient aider à définir les choses.

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

  • Setuptools est un projet né du désir de remplir la fonctionnalité distutils manquante et d'explorer de nouvelles directions. Dans certaines sous-communautés, c'est un de factola norme. Il utilise des patchs de singe et de la magie qui est désapprouvée par les développeurs core Python.

  • Distribuer est une fourchette de Setuptools qui a été lancée par des développeurs ayant le sentiment que son rythme de développement était trop lent et qu'il n'était pas possible de l'évoluer. Son développement a été considérablement ralenti lorsque distutils2 a été démarré par le même groupe. Mise à jour 2013-août: distribution est fusionnée dans setuptools et abandonnée.

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

Plus d'informations:

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


251
2018-06-29 15:07



REMARQUE: Answer obsolète, Distribuer maintenant obsolète.

Oui, vous l'avez. : -o Je pense que pour le moment le paquet préféré est Distribuer, qui est une fourchette de setuptools, qui sont une extension de distutils (le système d'emballage d'origine). Setuptools n'étant pas maintenu, il a été forké et renommé, mais lorsqu'il est installé, il utilise le nom de paquet de setuptools! Je pense que la plupart des développeurs Python utilisent maintenant Distribute, et je peux dire avec certitude que je le fais.


7
2018-06-14 14:00



Mise à jour de cette question fin 2014 où heureusement le chaos de l'emballage Python a été grandement nettoyé par Continuumconda" directeur chargé d'emballage.

En particulier, conda permet rapidement la création de conda "environnementsVous 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

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

Ensuite, vous pouvez appeler 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 d'administrateur requis
  • Gestion intelligente des dépendances (via un solveur SAT)
  • Gère bien les bibliothèques de niveau C, Fortran et au niveau du système avec lesquelles vous devrez peut-être vous lier

Ce dernier point est particulièrement important si vous êtes dans le domaine de l'informatique scientifique.


4
2017-09-29 21:26



Beaucoup de gens se sont plaints ici du manque d'orientation claire de la communauté sur cette question.

Actuellement, cela ressemble à la meilleure source d'informations sur les recommandations d'outils: https://packaging.python.org/en/latest/current.html#tool-recommendations


4
2017-10-03 09:39



Je me rends compte que j'ai répondu à votre question secondaire sans aborder les hypothèses incontestées dans votre problème original:

J'essaye de porter une bibliothèque open-source (SymPy, si quelqu'un me demande) à Python 3. Pour   Pour ce faire, j'ai besoin de lancer 2to3 automatiquement lors de la construction de Python 3.

Toi mai, ne pas avoir besoin. D'autres stratégies sont décrites à http://docs.python.org/dev/howto/pyporting

Pour ce faire, je dois utiliser distribuer,

Toi mai :) distutils prend en charge la conversion 2to3 en temps de construction pour le code (pas les docstrings), d'une manière différente: http://docs.python.org/dev/howto/pyporting#during-installation


3
2017-07-29 14:16



Ce sujet semble toujours en mouvement. Au 31/10/2013 le "Guide de l'utilisateur Python Packaging" Recommandations rapides définit "quel jeu d'outils est actuellement recommandé". Il y a aussi des liens vers "L'avenir de l'emballage en python"


2
2017-11-01 18:43