Python hat eine verwirrende Geschichte von Werkzeugen , die verwendet werden können Projekte zu verpacken und beschreiben: Dazu gehört distutils
in der Standard - Bibliothek, distribute
, distutils2
, und setuptools
(und vielleicht auch mehr). Es scheint, dass distribute
und distutils2
wurden zugunsten von eingestellt setuptools
, was zwei konkurrierende Standards lässt.
Meines Erachtens setuptools
bietet es weitaus mehr Optionen (z. B. das Deklarieren von Abhängigkeiten, Tests usw.) als es distutils
jedoch (noch?) Nicht in der Python-Standardbibliothek enthalten ist.
Das Python Packaging-Benutzerhandbuch [ 1 ] empfiehlt jetzt:
Verwenden Sie
setuptools
diese Option , um Projekte zu definieren und Quellverteilungen zu erstellen.
Und erklärt:
Obwohl Sie pure
distutils
für viele Projekte verwenden können, wird das Definieren von Abhängigkeiten von anderen Projekten nicht unterstützt, und es fehlen mehrere praktische Dienstprogramme zum automatischen korrekten Auffüllen von Paketmetadaten, die von bereitgestellt werdensetuptools
. Da setuptools außerhalb der Standardbibliothek liegt, bietet es auch einen konsistenteren Funktionsumfang für verschiedene Python-Versionen und wird (anders alsdistutils
)setuptools
aktualisiert, um die kommenden Standardformate „Metadata 2.0“ für alle unterstützten Versionen zu erstellen.Selbst für Projekte, die sich für die Verwendung entscheiden
distutils
, wird bei der Installation solcher Projekte durch pip direkt von der Quelle (anstatt von einer vorgefertigten Raddatei) Ihr Projekt tatsächlich mit erstelltsetuptools
.
Ein Blick in die setup.py- Dateien verschiedener Projekte zeigt jedoch, dass dies kein tatsächlicher Standard zu sein scheint. Viele Pakete verwenden immer noch distutils
und diejenigen, die dies unterstützen, setuptools
mischen sich häufig setuptools
mit distutils
z. B. durch einen Fallback-Import:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
Gefolgt von einem Versuch , einen Weg zu finden , ein Setup zu schreiben , die von beiden installiert werden können setuptools
und distutils
. Dies umfasst häufig verschiedene Methoden zur fehleranfälligen Abhängigkeitsprüfung, da distutils
Abhängigkeiten in der Setup-Funktion nicht unterstützt werden.
Warum bemühen sich die Leute immer noch um zusätzliche Unterstützung distutils
- ist die Tatsache, dass sie setuptools
nicht in der Standardbibliothek enthalten ist, der einzige Grund? Was sind die Vorteile distutils
und gibt es irgendwelche Nachteile zu schreiben setup.py Dateien , die nur Unterstützung setuptools
.
distutils
wurde wieder zusammengeführt insetuptools
, aber es gibt Legacy-Apps, die für die Verwendung geschrieben wurden,distutils
und es fallen Kosten für die Migration auf korrekte Standards an.setuptools
ist eine erweiterte Alternative zu "distutils
Beachten Sie jedoch, dass" das empfohlene Pip- Installationsprogramm alle setup.py-Skripte mit ausführtsetuptools
, auch wenn das Skript selbst nur importiertdistutils
"( Quelle )Antworten:
Schauen Sie sich diese SO-Frage an. Es erklärt alle Verpackungsmethoden sehr gut und kann in gewissem Maße zur Beantwortung Ihrer Frage beitragen: Unterschiede zwischen Distribute, Distutils, Setuptools und Distutils2?
Wie Sie sehen, sollten Setuptools Distutils vorgezogen werden, und ich sehe, woher Ihre Frage kommt. Ich sehe jedoch nicht, dass Distutils bald die Unterstützung verlieren, da es einfach ausgedrückt in vielen Fällen bei einigen gängigen Legacy-Programmen verwendet wird . Und wie Sie wahrscheinlich wissen, kann das Ändern solcher Dinge in Legacy-Programmen ziemlich schmerzhaft sein und mit einigen Problemen verbunden sein, zum Beispiel Inkompatibilitäten, die dann dazu führen würden, dass der Entwickler den Quellcode neu schreiben muss. Es gibt also das und auch die Tatsache, dass distutils ein Teil der Standard-Python-Bibliothek ist, während dies bei setuptools nicht der Fall ist. Wenn Sie also heutzutage ein Python-Programm erstellen, verwenden Sie setuptools. Beachten Sie jedoch, dass setuptools ohne distutils niemals existiert hätte.
quelle
Das ist ein Grund. Folgendes stammt direkt aus dem NumPy
setup.py
:NumPy bevorzugt es also,
setuptools
wenn es es finden kann. Aber dann hat SciPy dies getan, bis es gepatcht wurde, um esdistutils
in einigen Situationen zu bevorzugen . Zitieren des Festschreibungsprotokolls:Natürlich sollte eine Fusion zwischen
setuptools
unddistribute
dies alles zu gegebener Zeit beheben, aber viele Pakete müssen noch Python 2.6-Installationen unterstützen.quelle
distribute
war eine Gabelung vonsetuptools
und ist jetzt wieder zusammengeführt.Es gibt mehrere Gründe, über die wir immer noch sprechen und die Distutils verwenden, obwohl Setuptools ohne Zweifel das bessere Werkzeugset ist.
Erstens sind Distutils überall verfügbar. Wenn Sie ein Modul für die Freigabe mit anderen erstellen möchten und keine komplizierten Anforderungen haben, ist es garantiert auf Ihrem Arbeitscomputer verfügbar. Dies ist besonders wichtig, wenn Sie ältere Python-Versionen unterstützen müssen oder wenn Sie sich in einer unbekannten Umgebung befinden.
Zweitens bietet setuptools Verbesserungen für Distutils. Es ist daher dem distutils-Werkzeugsatz nachempfunden und nimmt von dort aus seine gesamte Struktur auf. In der Dokumentation zu setuptools wird davon ausgegangen, dass der Leser mit distutils vertraut ist, und es wird nur dokumentiert, wie der Basiswerkzeugsatz erweitert wird. Sie können sich vorstellen, dass distutils den Dialekt definiert und setuptools diesen Dialekt verbessert.
Mein persönlicher Ansatz für neue Projekte beginnt mit der Annahme, dass ich Distutils verwenden werde. Erst wenn das Projekt eine Funktion von setuptools benötigt, mache ich das Upgrade. Die setuptools sind ein Ersatz für distutils, eine einzeilige Änderung an meiner setup.py.
quelle
Grundsätzlich liegt es an der Aufteilung der Verantwortlichkeiten.
setuptools
ist kein Teil der Python-Standardbibliothek, da sie von einem Drittanbieter und nicht von einem Python-Kernteam verwaltet wird. Was unter anderem bedeutet:Tatsächlich hat das Kernteam den Umfang der Distutils eingegrenzt und die Teile "Kernstandards" und "minimal notwendige Kompilierung" für sich reserviert, während alle darüber hinausgehenden Dinge (erweiterter Compiler / Paketformat / welcher Support auch immer) Dritten überlassen wurden . Der Code, der zuvor diese "erweiterten Teile" abdeckte, wurde aus Gründen der Abwärtskompatibilität veraltet gelassen .
Aus dem Verteilen von Python-Modulen - Python 2.7.12-Dokumentation :
Pakete für andere Betriebssysteme werden wahrscheinlich ebenfalls
setuptools
undpip
separat bereitgestellt - aus den oben genannten Gründenquelle