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 le distutils
package Python qui peut être importé dans votre setup.py
script.
setuptools
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 le setuptools
package Python qui peut être importé dans votre setup.py
script et le pkg_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 le distutils
paquet Python avec des singes . Cela devrait bien fonctionner avec pip
. Il voit des sorties régulières.
scikit-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 avec pip
.
distlib
est une bibliothèque qui fournit des fonctionnalités utilisées par des outils de niveau supérieur comme pip
.
packaging
est également une bibliothèque qui fournit des fonctionnalités utilisées par des outils de niveau supérieur comme pip
etsetuptools
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 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 de distutils
, setuptools
et de distribute
devenir l'outil standard inclus dans la bibliothèque standard de Python. L'idée était qu'elle distutils2
serait distribuée pour les anciennes versions de Python, et qu'elle distutils2
serait renommée 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 il distutils2
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
et distutils2
.
Recommandation:
Si tout cela est nouveau pour vous et que vous ne savez pas par où commencer, je recommanderais d'apprendresetuptools
, avec pip
et 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.)