Unterschiede zwischen Distribute, Distutils, Setuptools und Distutils2?

594

Die Situation

Ich versuche, eine Open-Source-Bibliothek nach Python 3 zu portieren. ( SymPy , wenn sich jemand wundert.)

Daher muss ich 2to3beim Erstellen für Python 3 automatisch ausgeführt werden. Dazu muss ich verwenden distribute. Daher muss ich das aktuelle System portieren, das (laut Doktest) ist distutils.


Das Problem

Leider bin ich nicht sicher , was ist der Unterschied zwischen diesen Module- distutils, distribute, setuptools. Die Dokumentation ist so skizzenhaft wie am besten, da sie alle eine Gabelung voneinander zu sein scheinen und unter den meisten Umständen (aber eigentlich nicht allen) kompatibel sein sollen… und so weiter und so fort.


Die Frage

Könnte jemand die Unterschiede erklären? Was soll ich verwenden? Was ist die modernste Lösung? (Abgesehen davon würde ich mich auch über eine Anleitung zum Portieren freuen Distribute, aber das geht ein bisschen über den Rahmen der Frage hinaus…)

VPeric
quelle
22
Wie verwirrend? Ich komme aus Java / C ++ zu Python. In diesen Situationen ist die Verteilung sehr einfach. Mit Python bin ich in Bezug auf all diese Verteilungssysteme völlig verwirrt.
Raffi Khatchadourian
75
Ich stimme zu, Python-Verpackung / -Installation bietet viel zu viele Alternativen ohne klare Anleitung durch die Community.
Sabuncu
6
Ich wollte nur diese verwandten Informationen auf pip verlinken, die keine binären Verteilungen unterstützen lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat
@pixelbeat pip unterstützt die Installation von Rädern (sogenannte Binärverteilungen), diese Verknüpfung ist veraltet.
Flimm

Antworten:

836

Ab März 2020 sind die meisten anderen Antworten auf diese Frage mehrere Jahre veraltet. Wenn Sie Ratschläge zu Python-Verpackungsproblemen erhalten, denken Sie daran, das Veröffentlichungsdatum zu überprüfen, und vertrauen Sie nicht auf veraltete Informationen.

Das Python Packaging-Benutzerhandbuch ist eine Lektüre wert. Auf jeder Seite wird ein "zuletzt aktualisiertes" Datum angezeigt, sodass Sie die Aktualität des Handbuchs überprüfen können. Es ist recht umfassend. Die Tatsache, dass es auf einer Subdomain von python.org der Python Software Foundation gehostet wird, verleiht ihm nur Glaubwürdigkeit. Die Seite Projektzusammenfassungen ist hier besonders relevant.

Zusammenfassung der Werkzeuge:

Hier ist eine Zusammenfassung der Python-Verpackungslandschaft:

Unterstützte Tools:

Veraltete / verlassene Werkzeuge:

  • distributewar eine Gabelung von setuptools. Es hat denselben Namespace verwendet. Wenn Sie also Distribute installiert haben, wird import setuptoolsdas mit Distribute verteilte Paket tatsächlich importiert. Distribute wurde wieder in Setuptools 0.7 zusammengeführt , sodass Sie Distribute nicht mehr verwenden müssen. Tatsächlich ist die Version auf Pypi nur eine Kompatibilitätsschicht, die Setuptools installiert.

  • distutils2war ein Versuch , das Beste zu nehmen distutils, setuptoolsund distributeund wird das Standard - Tool in Python Standard - Bibliothek enthalten. Die Idee war , dass distutils2wäre für alte Python - Versionen verteilt werden, und dass distutils2umbenannt werden würde packagingfür Python 3.3, die es in seiner Standardbibliothek umfassen würde. Diese Pläne verliefen jedoch nicht wie beabsichtigt und sind derzeit distutils2ein aufgegebenes Projekt . Die neueste Version war im März 2012 und die Pypi-Homepage wurde endlich aktualisiert, um ihren Tod widerzuspiegeln.

Andere:

Wenn Sie interessiert sind, können Sie auch andere Tools lesen. Lesen Sie die Projektzusammenfassungen im Python Packaging-Benutzerhandbuch. Ich liste sie nicht alle, nicht die Seite zu wiederholen, und die Antwort auf die Frage zu halten Anpassung, die nur etwa war distribute, distutils, setuptoolsund distutils2.

Empfehlung:

Wenn all dies für Sie neu ist und Sie nicht wissen, wo Sie anfangen sollen, würde ich empfehlensetuptools , zusammen mit pipund zu lernenvirtualenv , die alle sehr gut zusammenarbeiten.

Wenn Sie schauen , in virtualenv, könnten Sie in dieser Frage interessieren: Was ist der Unterschied zwischen venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, etc? . (Ja, ich weiß, ich stöhne mit dir.)

Flimm
quelle
2
@makeramen: Siehe diesen Thread auf der Mailingliste .
Flimm
6
Und sieht nicht besser aus: 'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI Distribute Seite.
KurzedMetal
3
@KurzedMetal, laut den Leuten von SetupTools, wird setuptools 0.7 sowohl verteilen als auch die alten setuptools subsumieren, um die Ordnung im Universum wiederherzustellen. Die Dinge werden sich also tatsächlich erheblich verbessern!
John McDonnell
8
Das Python Packaging-Benutzerhandbuch enthält die aktuellsten Informationen zum Status der Python-Verpackung. Es wurde von Nick Coughlan auf der PyCon 2013 zur Kenntnis genommen .
Imanuelcostigan
1
@Flimm Die letzte Bearbeitung ist schon eine Weile her. Ist Bento inzwischen ausgereift?
Martin Thoma
251

Ich bin ein Distutils-Betreuer und distutils2 / Verpackungsmitarbeiter. Ich habe auf der ConFoo 2011 über Python-Verpackungen gesprochen und schreibe derzeit eine erweiterte Version davon. Es ist noch nicht veröffentlicht, daher hier Auszüge, die helfen sollen, Dinge zu definieren.

  • Distutils ist das Standardwerkzeug für Verpackungen. Es funktioniert ziemlich gut für einfache Bedürfnisse, ist aber begrenzt und nicht trivial zu erweitern.

  • Setuptools ist ein Projekt, das aus dem Wunsch heraus entstanden ist, fehlende Distutils-Funktionen zu füllen und neue Richtungen zu erkunden. In einigen Untergemeinschaften ist dies ein De-facto- Standard. Es verwendet Affen-Patching und Magie, die von Python-Kernentwicklern verpönt werden.

  • Distribute ist eine Abzweigung von Setuptools, die von Entwicklern gestartet wurde, die das Gefühl hatten, dass das Entwicklungstempo zu langsam war und es nicht möglich war, es weiterzuentwickeln. Seine Entwicklung wurde erheblich verlangsamt, als distutils2 von derselben Gruppe gestartet wurde. Update 2013 - August: Distribute wird wieder in Setuptools zusammengeführt und eingestellt.

  • Distutils2 ist eine neue Distutils-Bibliothek, die als Zweig der Distutils-Codebasis gestartet wurde. Sie enthält gute Ideen aus Setup-Tools (von denen einige in PEPs ausführlich besprochen wurden) und ein von pip inspiriertes Basisinstallationsprogramm. Der tatsächliche Name, den Sie zum Importieren von Distutils2 verwenden, befindet sich packagingin der Python 3.3+ Standardbibliothek oder distutils2in 2.4+ und 3.1–3.2. (Ein Backport wird in Kürze verfügbar sein.) Distutils2 hat die Python 3.3-Version nicht erstellt und sie wurde angehalten.

Mehr Info:

Ich hoffe, dass ich meinen Leitfaden bald fertigstellen kann. Er enthält weitere Informationen zu den Stärken und Schwächen jeder Bibliothek sowie einen Übergangsleitfaden.

Éric Araujo
quelle
1
Nein. Distutils2 übernimmt einige gute Ideen von setuptools / Distribute nach der Standardisierung (PEPs) oder nicht (zum Beispiel betreue ich einen GSoC-Studenten, der einen Entwicklungsbefehl und eine automatische Skripterstellung hinzufügt), aber es wird nie ein Drop-In sein Ersatz: Es gibt einige Teile, die wir nicht wollen (Eier, VCS-Integration usw.). OTOH, distutils2 hat einige Dinge, die Setuptools / Distribute nicht haben. Um den Übergang zu erleichtern, werden die Distributionsentwickler möglicherweise distutils2 verwenden, um neue Standards und Tools zu unterstützen. Ich denke auch, dass ich mich daran erinnere, dass der Entwickler von setuptools gesagt hat, er möchte neue Standards unterstützen.
Éric Araujo
1
Wo fällt ez_setup in all dem hin? Gibt es auch Aktualisierungen zum Status von distutils2?
James McMahon
2
@ ÉricAraujo Tut mir leid, von der Verzögerung zu hören. Ich hoffe wirklich, dass es rechtzeitig für 3.4 fertig ist! Ich liebe Python, aber die Verpackung hat mich immer dazu gebracht, meinen Kopf gegen die Wand zu schlagen. (In anderen Nachrichten, wie kommt Ihr Führer? Wenn es fertig ist, können Sie es in Ihrer Antwort oben
verlinken
9
@AlexisHuet Diese Art von Kommentar wäre besser, wenn er den Link zum Kommentar unten enthalten würde (den Sie über die shareSchaltfläche erhalten können).
Erikbwork
2
Sie sollten möglicherweise die Antwort aktualisieren, um zu erwähnen, dass sie distributekürzlich wieder zusammengeführt wurde setuptools. Die Tatsache, dass viele der Informationen da draußen veraltet sind, trägt zur Verwirrung bei
Amro
5

HINWEIS: Antwort veraltet, Verteilen jetzt veraltet. Diese Antwort ist nicht mehr gültig, da die Python Packaging Authority gegründet wurde und viel Arbeit geleistet hat, um dies zu bereinigen.


Ja, du hast es verstanden. : -o Ich denke, zu diesem Zeitpunkt ist Distribute die bevorzugte Verpackung , eine Gabel aus Setuptools, die eine Erweiterung von Distutils sind (das Originalverpackungssystem). Setuptools wurde nicht gewartet, wurde also gegabelt und umbenannt. Bei der Installation wird jedoch der Paketname setuptools verwendet! Ich denke, die meisten Python-Entwickler verwenden jetzt Distribute, und ich kann mit Sicherheit sagen, dass ich das tue.

Keith
quelle
Für die Aufzeichnung habe ich diese Antwort akzeptiert, weil sie mir jetzt die Situation mitteilte (und die Gabelung ist die Erweiterung der Beziehung, die das Bild in der anderen Antwort einfach nicht erwähnt). Und irgendwo auf der Straße habe ich auch erfahren, dass die Dokumentation selbst normalerweise nicht sicher ist, was sie zu sagen versucht.
VPeric
2
@VPeric, In der Tat spiegelt die Dokumentation die Tatsache wider, dass sich dieser Aspekt von Python in einem Zustand des Flusses / Chaos befindet.
Juanchopanza
2

Mir ist klar, dass ich auf Ihre sekundäre Frage geantwortet habe, ohne die unbestrittenen Annahmen in Ihrem ursprünglichen Problem anzusprechen:

Ich versuche, eine Open-Source-Bibliothek (SymPy, falls sich jemand wundert) nach Python 3 zu portieren. Dazu muss ich beim Erstellen für Python 3 automatisch 2to3 ausführen.

Sie können nicht brauchen . Andere Strategien sind unter http://docs.python.org/dev/howto/pyporting beschrieben

Um das zu tun, muss ich Distribute verwenden,

Sie können :) distutils unterstützt die Build-Time-2to3-Konvertierung für Code (nicht Docstrings) auf eine andere Art und Weise, die verteilt wird: http://docs.python.org/dev/howto/pyporting#during-installation

Éric Araujo
quelle
Vielen Dank, obwohl wir uns bereits entschlossen haben, das Problem zu lösen, indem wir unser Skript für die Konvertierung geschrieben haben. Und ja, ich wusste, dass es andere Optionen als die Verwendung von 2to3 gibt, aber SymPy ist eine komplexe Codebasis (mehr als 200.000 Zeilen, als ich das letzte Mal nachgesehen habe) und die Verwendung von 2to3 war die einzig realistische Strategie. Nochmals vielen Dank auf jeden Fall!
VPeric
2

Aktualisierung dieser Frage Ende 2014, wo das Python-Verpackungschaos zum Glück vom Continuum- Paketmanager " conda " erheblich aufgeräumt wurde .

Insbesondere ermöglicht conda schnell die Schaffung von conda " Umgebungen ". Sie können Ihre Umgebungen mit verschiedenen Versionen von Python konfigurieren. Zum Beispiel:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

erstellt zwei ("py34" oder "py26") Python-Umgebungen mit unterschiedlichen Python-Versionen.

Anschließend können Sie die Umgebung mit der spezifischen Version von Python aufrufen mit:

source activate <env name>

Diese Funktion scheint besonders nützlich zu sein, wenn Sie mit einer anderen Version von Python arbeiten müssen.

Darüber hinaus hat conda die folgenden Merkmale:

  • Python-Agnostiker
  • Plattformübergreifend
  • Keine Administratorrechte erforderlich
  • Intelligentes Abhängigkeitsmanagement (über einen SAT-Solver)
  • Befasst sich gut mit Bibliotheken auf C-, Fortran- und Systemebene, gegen die Sie möglicherweise eine Verknüpfung herstellen müssen

Dieser letzte Punkt ist besonders wichtig, wenn Sie sich im Bereich der wissenschaftlichen Datenverarbeitung befinden.

Julien Chastang
quelle