setuptools vs. distutils: warum sind distutils immer noch eine sache?

142

Python hat eine verwirrende Geschichte von Werkzeugen , die verwendet werden können Projekte zu verpacken und beschreiben: Dazu gehört distutilsin der Standard - Bibliothek, distribute, distutils2, und setuptools(und vielleicht auch mehr). Es scheint, dass distributeund distutils2wurden zugunsten von eingestellt setuptools, was zwei konkurrierende Standards lässt.

Meines Erachtens setuptoolsbietet es weitaus mehr Optionen (z. B. das Deklarieren von Abhängigkeiten, Tests usw.) als es distutilsjedoch (noch?) Nicht in der Python-Standardbibliothek enthalten ist.

Das Python Packaging-Benutzerhandbuch [ 1 ] empfiehlt jetzt:

Verwenden Sie setuptoolsdiese Option , um Projekte zu definieren und Quellverteilungen zu erstellen.

Und erklärt:

Obwohl Sie pure distutilsfü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 werden setuptools. Da setuptools außerhalb der Standardbibliothek liegt, bietet es auch einen konsistenteren Funktionsumfang für verschiedene Python-Versionen und wird (anders als distutils) setuptoolsaktualisiert, 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 erstellt setuptools.

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 distutilsund diejenigen, die dies unterstützen, setuptoolsmischen sich häufig setuptoolsmit distutilsz. 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 setuptoolsund distutils. Dies umfasst häufig verschiedene Methoden zur fehleranfälligen Abhängigkeitsprüfung, da distutilsAbhä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 setuptoolsnicht in der Standardbibliothek enthalten ist, der einzige Grund? Was sind die Vorteile distutilsund gibt es irgendwelche Nachteile zu schreiben setup.py Dateien , die nur Unterstützung setuptools.

cel
quelle
4
distutilswurde wieder zusammengeführt insetuptools , aber es gibt Legacy-Apps, die für die Verwendung geschrieben wurden, distutilsund es fallen Kosten für die Migration auf korrekte Standards an.
Metatoaster
3
"Es scheint, dass Distribute und Distutils2 zugunsten von Setuptools eingestellt wurden", richtig, Distribute ist jetzt nur ein Wrapper für Setuptools, und Distutils2 ist tot.
Kay - SE ist böse
1
setuptoolsist eine erweiterte Alternative zu " distutilsBeachten Sie jedoch, dass" das empfohlene Pip- Installationsprogramm alle setup.py-Skripte mit ausführt setuptools, auch wenn das Skript selbst nur importiertdistutils "( Quelle )
user2314737

Antworten:

77

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?

Distutils ist immer noch das Standardwerkzeug zum Verpacken in Python. Es ist in der Standardbibliothek enthalten (Python 2 und Python 3.0 bis 3.3). Es ist nützlich für einfache Python-Distributionen, es fehlen jedoch Funktionen. Es wird das distutils Python-Paket vorgestellt, das in Ihr setup.py-Skript importiert werden kann.

Setuptools wurde entwickelt, um die Einschränkungen von Distutils zu überwinden und ist nicht in der Standardbibliothek enthalten. Es wurde ein Befehlszeilenprogramm namens easy_install eingeführt. Außerdem wurden das Python-Paket setuptools eingeführt, das in Ihr Skript setup.py importiert werden kann, und das Python-Paket pkg_resources, das in Ihren Code importiert werden kann, um mit einer Distribution installierte Datendateien zu finden. Eine seiner Fallstricke ist, dass es das distutils Python-Paket mit Affen-Patches bearbeitet. Es sollte gut mit Pip funktionieren. Die neueste Version wurde im Juli 2013 veröffentlicht.

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.

kubanczyk
quelle
3
"Distutils ist immer noch das Standardwerkzeug für das Packen in Python." widerspricht dem Python Packaging-Benutzerhandbuch.
Cel
1
Ich glaube nicht, heißt es ausdrücklich, dass Setuptools der Standard sind. Beachten Sie auch, dass dieser Satz von der von mir bereitgestellten Website zitiert wurde. Dies sind also nicht meine Worte. Es ist jedoch eine Meinung, der ich unter vielen anderen Menschen zustimme.
Ich habe dir das Kopfgeld verliehen, da die Community dir zuzustimmen scheint. Leider hat diese Frage nicht so viel Aufmerksamkeit erhalten, wie ich es mir gewünscht hatte.
Cel
easy_install ist der Hauptgrund, warum ich setuptools abgelehnt habe - es war eine große Problemquelle für mich in Paketen, die es verwenden (einfacher, es einfach neu zu verpacken). Andere Funktionen sind in Ordnung.
Stuart Gathman
14

ist die Tatsache, dass setuptools nicht in der Standardbibliothek enthalten ist, der einzige Grund

Das ist ein Grund. Folgendes stammt direkt aus dem NumPysetup.py :

if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
        sys.argv[1] in ('--help-commands', 'egg_info', '--version',
                        'clean')):
    # Use setuptools for these commands (they don't work well or at all
    # with distutils).  For normal builds use distutils.
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

NumPy bevorzugt es also, setuptoolswenn es es finden kann. Aber dann hat SciPy dies getan, bis es gepatcht wurde, um es distutilsin einigen Situationen zu bevorzugen . Zitieren des Festschreibungsprotokolls:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

Natürlich sollte eine Fusion zwischen setuptoolsund distributedies alles zu gegebener Zeit beheben, aber viele Pakete müssen noch Python 2.6-Installationen unterstützen.

Fred Foo
quelle
1
distributewar eine Gabelung von setuptoolsund ist jetzt wieder zusammengeführt.
R4444
10

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.

user590028
quelle
Danke für deine Antwort. Ich denke, das Verfügbarkeitsargument kann nicht so wichtig sein, da die setuptools-Installation gebootet werden kann. Ich sehe, dass es Sinn macht, Distutils zu verwenden, wenn es genügend Funktionalität bietet. Aber das Mischen von Distutils und Setuptools ist meiner Meinung nach kein sehr sauberer Weg, um seine Ziele zu erreichen. Obwohl @larsmans in seiner Antwort einige Schwierigkeiten mit Setuptools zeigte, die die Verwendung von Distutils für einige Aufgaben erzwingen.
Cel
9

Grundsätzlich liegt es an der Aufteilung der Verantwortlichkeiten.

setuptoolsist kein Teil der Python-Standardbibliothek, da sie von einem Drittanbieter und nicht von einem Python-Kernteam verwaltet wird. Was unter anderem bedeutet:

  • Es wird nicht von der Kerntestsuite abgedeckt und von der Kernfunktionalität nicht genutzt
  • es nicht selbst gesetzt Kernstandards für Add-On - Module (Standort, mittels Import C - Erweiterungen Binärschnittstelle etc.).
  • Es wird unabhängig von Python-Versionen aktualisiert und veröffentlicht

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 :

Während die direkte Nutzung von distutilsausläuft, hat sie dennoch den Grundstein für die aktuelle Verpackungs- und Vertriebsinfrastruktur gelegt und bleibt nicht nur Teil der Standardbibliothek, sondern ihr Name lebt auch auf andere Weise weiter (z. B. als Name der Mailingliste wird verwendet, um die Entwicklung von Python-Verpackungsstandards zu koordinieren).

Pakete für andere Betriebssysteme werden wahrscheinlich ebenfalls setuptoolsund pipseparat bereitgestellt - aus den oben genannten Gründen

  • und weil sie nicht notwendig sind - oder sogar die Wartbarkeit beeinträchtigen -, wenn bereits ein anderer Paketmanager auf dem System vorhanden ist.
ivan_pozdeev
quelle