38 Distribution von Python-Projekten 

Es ist anzunehmen, dass Sie im Laufe dieses Buchs bereits das eine oder andere eigenständige Python-Programm geschrieben haben. Vielleicht haben Sie sogar schon ein Programm oder Modul in Python geschrieben, das auch für andere Anwender von Nutzen sein könnte. In diesem Moment stellt sich die Frage, wie ein Python-Programm oder -Modul adäquat veröffentlicht werden kann. Idealerweise sollte es so geschehen, dass der Benutzer kein Experte sein muss, um es zu installieren.
Zunächst werden wir die bestehenden Ansätze zur Distribution von Python-Paketen zusammenfassen und dann in Abschnitt 38.2 ausführlich auf das Drittanbieterpaket setuptools eingehen. Zum Schluss, in Abschnitt 38.5, beleuchten wir einen weiteren wichtigen Aspekt beim Erzeugen von Distributionen: die Lokalisierung von Programmen.
38.1 Eine Geschichte der Distributionen in Python 

Bei der Distribution von Software geht es darum, die relevanten Daten, beispielsweise Bibliotheken, ausführbare Dateien oder auch Quellcode, in einer Distribution oder einem Paket anzubieten, das für den Benutzer komfortabel zu installieren ist. Grundsätzlich unterscheidet man zwei Typen von Distributionen:
- Eine Quellcodedistribution (engl. source distribution) enthält keine vorkompilierten Daten, sondern nur den Quellcode der angebotenen Software. Dieser Quellcode muss auf der Benutzerseite kompiliert werden. Eine Quellcodedistribution hat den Vorteil, dass sie unverändert auf allen unterstützten Plattformen verwendet werden kann.
- Eine Binärdistribution (engl. binary distribution) enthält ein Kompilat der Software. Aus diesem Grund sind Binärdistributionen in der Regel plattformabhängig, es müssen also für viele Zielplattformen eigene Distributionen erstellt werden. Der Vorteil einer Binärdistribution liegt in ihrer einfachen Installation: Die enthaltenen Dateien müssen nur an die richtige Stelle im System kopiert werden. Insbesondere ist kein Build-Schritt notwendig.
In der Python-Welt existiert eine verwirrende Vielfalt von Ansätzen zur Erzeugung von Distributionen. In den folgenden Abschnitten stellen wir Ihnen die wichtigsten dieser Ansätze vor.
38.1.1 Der klassische Ansatz – distutils 

Das Paket distutils ist in der Standardbibliothek enthalten und war für lange Zeit der Standard zur Distribution von Python-Software. Zum Erstellen einer Distribution wird ein Installationsskript namens setup.py angelegt, das die Eigenschaften der Distribution beschreibt. Dazu gehören beispielsweise Metadaten wie der Urheber oder die Lizenz und eine Liste der Dateien, die in die Distribution aufgenommen werden soll. Durch das Ausführen des Installationsskripts kann eine Quellcode- oder Binärdistribution erzeugt werden:
- Eine Quellcodedistribution enthält ihrerseits das Installationsskript setup.py, das in diesem Fall verwendet werden kann, um die Software auf dem Zielsystem zu installieren.
- Eine Binärdistribution wird in Form eines Windows-Installers oder eines RPM-Pakets für bestimmte Linux-Distributionen erstellt.
Das Paket distutils findet auch heute noch Verwendung und kann, da es in der Standardbibliothek enthalten ist, auch bedenkenlos verwendet werden. Es hat aber den großen Nachteil, dass Abhängigkeiten zwischen Distributionen nicht berücksichtigt werden können. Dies ist einer der Gründe, die zur Entwicklung von setuptools geführt haben.
38.1.2 Der neue Standard – setuptools 

Das Drittanbieterpaket setuptools basiert auf distutils, wird also in ähnlicher Weise verwendet und ist kompatibel zu distutils-Installationsskripten. Es übertrifft den Funktionsumfang von distutils in einigen wichtigen Punkten, was es zum neuen Standard bei der Distribution von Python-Software gemacht hat:
-
Mit setuptools können sogenannte Python Eggs erstellt werden. Das sind spezielle Distributionen, erkennbar an der Endung .egg, die zusätzliche Metadaten enthalten, insbesondere Abhängigkeiten zu anderen Eggs. Python Eggs müssen nicht installiert werden, sondern können direkt eingebunden werden.
Das Prinzip von Eggs in Python ist mit dem von JAR-Dateien in Java vergleichbar. - Mithilfe von Python Eggs ist es möglich, Namensraumpakete zu erstellen. Das sind Metapakete, die aus einer Menge weiterer Pakete bestehen.
- Das in setuptools enthaltene Tool EasyInstall kann Paketabhängigkeiten auflösen und eventuell fehlende Pakete installieren oder aktualisieren. Dazu verwendet es den Python-Paketindex PyPI (siehe Abschnitt 38.1.3).
Da es sich bei setuptools um ein Drittanbieterpaket handelt, das nicht in der Standardbibliothek enthalten ist, muss es vor dem Erstellen und Installieren von Distributionen installiert sein. Die Installation von setuptools erfolgt über ein sogenanntes Bootstrap-Skript namens ez_setup.py, das Sie sich von der Projektseite[ 172 ](https://pypi.python.org/pypi/setuptools) herunterladen können. Dieses Bootstrap-Skript kann auch in Distributionen eingebunden werden, damit bei der Installation automatisch setuptools heruntergeladen und mit installiert wird, sollte es nicht bereits vorhanden sein.
[»] Hinweis
Python Eggs werden in Zukunft durch das neuere und vollständig standardisierte Distributionsformat Python Wheel ersetzt. Am grundlegenden Arbeitsablauf ändert sich jedoch nichts, auch Wheels können mit setuptools erzeugt werden.
38.1.3 Der Paketindex – PyPI und pip 

Der Python Package Index PyPI ist eine von der Python Software Foundation verwaltete Sammlung von Python-Paketen, die unter https://pypi.python.org abrufbar ist. Er ist vergleichbar mit dem bekannteren CPAN für die Programmiersprache Perl.
Die im PyPI aufgeführten Pakete können mit einem kompatiblen Paketmanager bequem heruntergeladen und installiert werden. Dabei installiert bzw. aktualisiert der Paketmanager gegebenenfalls Abhängigkeiten. Neben dem bereits angesprochenen Paketmanager EasyInstall steht auch der fortschrittlichere Paketmanager pip, der in Abschnitt 38.3 vorgestellt wird, zur Verfügung.
Es ist nach einer Anmeldung auch möglich, eigene Pakete in den PyPI einzutragen.