Python a une histoire confusion des outils qui peuvent être utilisés pour emballer et décrire les projets: ceux - ci sont distutils
dans la bibliothèque standard, distribute
, distutils2
et setuptools
(et peut - être plus). Il semble que distribute
et distutils2
ont été abandonnés en faveur de setuptools
, ce qui laisse deux normes concurrentes.
À ma connaissance, il setuptools
offre beaucoup plus d'options (par exemple, déclarer des dépendances, des tests, etc.) que distutils
, cependant, il n'est pas inclus dans la bibliothèque standard Python (encore?).
Le guide de l'utilisateur de Python Packaging [ 1 ] recommande maintenant:
Permet
setuptools
de définir des projets et de créer des distributions source.
Et explique:
Bien que vous puissiez utiliser pure
distutils
pour de nombreux projets, il ne prend pas en charge la définition de dépendances sur d’autres projets et il manque plusieurs utilitaires pratiques permettant de remplir automatiquement correctement les métadonnées de package fournies parsetuptools
. En dehors de la bibliothèque standard, setuptools offre également un ensemble de fonctionnalités plus cohérent dans différentes versions de Python, et (contrairement àdistutils
),setuptools
sera mis à jour pour produire les prochains formats standard «Metadata 2.0» sur toutes les versions prises en charge.Même pour les projets qui choisissent d'utiliser
distutils
, lorsque pip installe ces projets directement à partir de la source (plutôt que d'installer à partir d'un fichier de roue prédéfini), il construira en fait votre projet à lasetuptools
place.
Cependant, l' examen des fichiers setup.py de divers projets révèle que cela ne semble pas être une norme réelle. De nombreux packages utilisent encore distutils
et ceux qui prennent en charge setuptools
se mélangent souvent setuptools
avec, distutils
par exemple en effectuant une importation de secours:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
Suivi d'une tentative pour trouver un moyen d'écrire une configuration pouvant être installée à la fois par setuptools
et distutils
. Cela inclut souvent diverses méthodes de vérification des dépendances sujettes aux erreurs, car distutils
ne prend pas en charge les dépendances dans la fonction de configuration.
Pourquoi les gens font-ils encore des efforts supplémentaires pour soutenir distutils
- le fait que ce setuptools
ne soit pas dans la bibliothèque standard est-il la seule raison? Quels sont les avantages distutils
et y a-t-il des inconvénients à écrire des fichiers setup.py qui ne prennent en charge que setuptools
.
distutils
a été fusionné danssetuptools
, mais il existe des applications héritées qui ont été écrites pour être utiliséesdistutils
et la migration vers les normes appropriées entraîne des coûts.setuptools
est une alternative améliorée àdistutils
mais notez que " Le programme d' installation pip recommandé exécute tous les scripts setup.py avecsetuptools
, même si le script lui-même importe uniquementdistutils
" ( source )Réponses:
Jetez un œil à cette question SO. Il explique très bien toutes les méthodes d'emballage et pourrait aider à répondre à votre question dans une certaine mesure: les différences entre distribuer, distutils, setuptools et distutils2?
Donc, comme vous pouvez le voir, setuptools devrait être préféré aux distutils, et je vois d'où vient votre question, mais je ne vois pas distutils perdre son support de sitôt, car, en termes simples, il est utilisé dans de nombreux cas avec certains programmes hérités populaires . Et comme vous le savez probablement, changer ce genre de choses dans les programmes hérités peut être assez pénible et entraîner de nombreux problèmes, par exemple des incompatibilités, ce qui obligerait alors le développeur à réécrire le code source. Il y a donc cela, et aussi le fait que distutils fait partie de la bibliothèque python standard alors que setuptools ne l'est pas. Donc, si vous créez un programme python, à notre époque, utilisez setuptools, mais gardez à l'esprit que sans distutils, setuptools n'aurait jamais existé.
la source
C'est une des raisons. Ce qui suit provient directement du NumPy
setup.py
:Donc NumPy préfère
setuptools
s'il peut le trouver. Mais ensuite, SciPy faisait cela, jusqu'à ce qu'il soit corrigé pour préférerdistutils
dans certaines situations. Citant le journal de validation:Bien sûr, une fusion entre
setuptools
etdistribute
devrait résoudre tout cela en temps voulu, mais de nombreux paquets doivent encore prendre en charge les installations de Python 2.6.la source
distribute
était une fourchette desetuptools
et est maintenant fusionné.Il y a plusieurs raisons dont nous parlons et utilisons encore distutils, même si setuptools est sans aucun doute le meilleur ensemble d'outils.
Premièrement, distutils est disponible partout. Si vous cherchez à créer un module pour le partager avec d'autres et que vous n'avez pas d'exigences compliquées, il est garanti qu'il sera disponible sur votre machine de travail. Ceci est particulièrement important si vous devez prendre en charge des versions plus anciennes de python, ou si vous travaillez dans un environnement inconnu.
Deuxièmement, setuptools apporte des améliorations aux distutils. Il est donc modélisé d'après le jeu d'outils distutils et prend toute sa structure à partir de là. La documentation de setuptools suppose que le lecteur est familiarisé avec distutils et ne documente que la manière dont il améliore le jeu d'outils de base. Vous pouvez penser que distutils définit le dialecte et setuptools améliore ce dialecte.
Mon approche personnelle pour les nouveaux projets est de commencer par l'hypothèse que je vais utiliser distutils. Ce n'est qu'au fur et à mesure que le projet grandit et nécessite une fonctionnalité de setuptools que je procède à la mise à niveau. Le setuptools est un remplacement direct pour distutils, c'est un changement d'une ligne à mon setup.py.
la source
Fondamentalement, c'est dû à la division des responsabilités.
setuptools
ne fait pas partie de la bibliothèque standard Python car elle est maintenue par une tierce partie plutôt que par l'équipe principale de Python. Ce qui signifie, entre autres:Effectivement, l'équipe de base a réduit la portée des distutils , se réservant les parties "standards de base" et "compilation minimale nécessaire" tout en laissant tout le reste (compilateur étendu / format de package / quel que soit le support) à des tiers. Le code qui couvrait auparavant ces "parties étendues" est resté périmé pour des raisons de compatibilité ascendante.
From Distributing Python Modules - Documentation Python 2.7.12 :
Les packages pour d'autres systèmes d'exploitation sont également susceptibles de fournir
setuptools
etpip
séparément - pour les raisons susmentionnéesla source