Die Situation
Ich versuche, eine Open-Source-Bibliothek nach Python 3 zu portieren. ( SymPy , wenn sich jemand wundert.)
Daher muss ich 2to3
beim 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…)
Antworten:
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:
distutils
ist immer noch das Standardwerkzeug zum Packen in Python. Es ist in der Standardbibliothek enthalten (Python 2 und Python 3). Es ist nützlich für einfache Python-Distributionen, es fehlen jedoch Funktionen. Es wird dasdistutils
Python-Paket vorgestellt, das in Ihrsetup.py
Skript importiert werden kann .distutils
Abschnitt des Python Package-Benutzerhandbuchssetuptools
wurde entwickelt, um die Einschränkungen von Distutils zu überwinden, und ist nicht in der Standardbibliothek enthalten. Es wurde ein Befehlszeilenprogramm namens aufgerufeneasy_install
. Außerdem wurde dassetuptools
Python-Paket eingeführt, das in Ihrsetup.py
Skript importiert werden kann , und daspkg_resources
Python-Paket, das in Ihren Code importiert werden kann, um mit einer Distribution installierte Datendateien zu finden. Eines seiner Probleme ist, dass es dasdistutils
Python-Paket mit Affen-Patches bearbeitet . Es sollte gut funktionieren mitpip
. Es sieht regelmäßige Veröffentlichungen.setuptools
Abschnitt des Python Package-Benutzerhandbuchsscikit-build
ist ein verbesserter Build-System-Generator, der CMake intern verwendet, um kompilierte Python-Erweiterungen zu erstellen. Da Scikit-Build nicht auf Distutils basiert, hat es keine wirklichen Einschränkungen. Wenn Ninja-Build vorhanden ist, kann Scikit-Build große Projekte dreimal schneller kompilieren als die Alternativen. Es sollte gut funktionieren mitpip
.scikit-build
Abschnitt des Python Package-Benutzerhandbuchsdistlib
ist eine Bibliothek, die Funktionen bereitstellt, die von übergeordneten Tools wie verwendet werdenpip
.distlib
Abschnitt des Python Package-Benutzerhandbuchspackaging
ist auch eine Bibliothek, die Funktionen bietet, die von übergeordneten Tools wiepip
und verwendet werdensetuptools
packaging
Abschnitt des Python Package-BenutzerhandbuchsVeraltete / verlassene Werkzeuge:
distribute
war eine Gabelung vonsetuptools
. Es hat denselben Namespace verwendet. Wenn Sie also Distribute installiert haben, wirdimport setuptools
das 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.distutils2
war ein Versuch , das Beste zu nehmendistutils
,setuptools
unddistribute
und wird das Standard - Tool in Python Standard - Bibliothek enthalten. Die Idee war , dassdistutils2
wäre für alte Python - Versionen verteilt werden, und dassdistutils2
umbenannt werden würdepackaging
für Python 3.3, die es in seiner Standardbibliothek umfassen würde. Diese Pläne verliefen jedoch nicht wie beabsichtigt und sind derzeitdistutils2
ein 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
,setuptools
unddistutils2
.Empfehlung:
Wenn all dies für Sie neu ist und Sie nicht wissen, wo Sie anfangen sollen, würde ich empfehlen
setuptools
, zusammen mitpip
und zu lernenvirtualenv
, die alle sehr gut zusammenarbeiten.Wenn Sie schauen , in
virtualenv
, könnten Sie in dieser Frage interessieren: Was ist der Unterschied zwischenvenv
,pyvenv
,pyenv
,virtualenv
,virtualenvwrapper
, etc? . (Ja, ich weiß, ich stöhne mit dir.)quelle
'Distribute' is a now deprecated fork of the 'Setuptools' project.
@ PyPI Distribute Seite.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 sichDistutils2 hat die Python 3.3-Version nicht erstellt und sie wurde angehalten.packaging
in der Python 3.3+ Standardbibliothek oderdistutils2
in 2.4+ und 3.1–3.2. (Ein Backport wird in Kürze verfügbar sein.)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.
quelle
share
Schaltfläche erhalten können).distribute
kürzlich wieder zusammengeführt wurdesetuptools
. Die Tatsache, dass viele der Informationen da draußen veraltet sind, trägt zur Verwirrung beiHINWEIS: 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.
quelle
Mir ist klar, dass ich auf Ihre sekundäre Frage geantwortet habe, ohne die unbestrittenen Annahmen in Ihrem ursprünglichen Problem anzusprechen:
Sie können nicht brauchen . Andere Strategien sind unter http://docs.python.org/dev/howto/pyporting beschrieben
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
quelle
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:
Dieser letzte Punkt ist besonders wichtig, wenn Sie sich im Bereich der wissenschaftlichen Datenverarbeitung befinden.
quelle