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 2to3
automatiquement 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 ...)
Réponses:
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:
distutils
est toujours l'outil standard pour l'empaquetage en Python. Il est inclus dans la bibliothèque standard (Python 2 et Python 3). Il est utile pour les distributions Python simples, mais manque de fonctionnalités. Il présente ledistutils
package Python qui peut être importé dans votresetup.py
script.distutils
section du Guide de l'utilisateur du package Pythonsetuptools
a été développé pour surmonter les limitations 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 introduit lesetuptools
package Python qui peut être importé dans votresetup.py
script et lepkg_resources
package Python qui peut être importé dans votre code pour localiser les fichiers de données installés avec une distribution. L'un de ses pièges est qu'il patche ledistutils
paquet Python avec des singes . Cela devrait bien fonctionner avecpip
. Il voit des sorties régulières.setuptools
section du Guide de l'utilisateur du package Pythonscikit-build
est un générateur de système de construction amélioré qui utilise en interne CMake pour créer des extensions Python compilées. Parce que scikit-build n'est pas basé sur des distutils, il n'a vraiment aucune de ses limites. Lorsque ninja-build est présent, scikit-build peut compiler de grands projets plus de trois fois plus rapidement que les alternatives. Cela devrait bien fonctionner avecpip
.scikit-build
section du Guide de l'utilisateur du package Pythondistlib
est une bibliothèque qui fournit des fonctionnalités utilisées par des outils de niveau supérieur commepip
.distlib
section du Guide de l'utilisateur du package Pythonpackaging
est également une bibliothèque qui fournit des fonctionnalités utilisées par des outils de niveau supérieur commepip
etsetuptools
packaging
section du Guide de l'utilisateur du package PythonOutils obsolètes / abandonnés:
distribute
était une fourchette desetuptools
. Il partageait le même espace de noms, donc si vous aviez installé Distribute,import setuptools
importerait 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 dedistutils
,setuptools
et dedistribute
devenir l'outil standard inclus dans la bibliothèque standard de Python. L'idée était qu'elledistutils2
serait distribuée pour les anciennes versions de Python, et qu'elledistutils2
serait renomméepackaging
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 ildistutils2
s'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
,setuptools
etdistutils2
.Recommandation:
Si tout cela est nouveau pour vous et que vous ne savez pas par où commencer, je recommanderais d'apprendre
setuptools
, avecpip
etvirtualenv
, 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 entrevenv
,pyvenv
,pyenv
,virtualenv
,virtualenvwrapper
, etc? . (Oui, je sais, je gémis avec toi.)la source
'Distribute' is a now deprecated fork of the 'Setuptools' project.
@ PyPI Distribute page.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 trouveDistutils2 n'a pas fait la version Python 3.3, et elle a été mise en attente.packaging
dans la bibliothèque standard Python 3.3+, oudistutils2
dans 2.4+ et 3.1–3.2. (Un backport sera bientôt disponible.)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.
la source
share
bouton).distribute
a récemment été réintégréesetuptools
. Le fait qu'une grande partie des informations disponibles soit obsolète ajoute à la confusionREMARQUE: 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.
la source
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:
Vous mai , pas besoin . D'autres stratégies sont décrites sur http://docs.python.org/dev/howto/pyporting
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
la source
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:
Ce dernier point est particulièrement important si vous êtes dans le domaine du calcul scientifique.
la source