Ein umfassender Leitfaden zur Verteilung von Python-Paketen ĂĽber PyPI, der Best Practices fĂĽr das Versionsmanagement, Werkzeuge und Workflows fĂĽr globale Entwickler behandelt.
Verteilung von Python-Paketen: Veröffentlichung auf PyPI und Versionsmanagement
Das umfangreiche Ökosystem von Python wird durch eine riesige Sammlung von Paketen angetrieben, die über den Python Package Index (PyPI) leicht verfügbar sind. Dieser Leitfaden bietet einen umfassenden Überblick darüber, wie Sie Ihre eigenen Python-Pakete über PyPI verteilen können, um sicherzustellen, dass sie für Entwickler weltweit zugänglich sind. Wir werden die wesentlichen Werkzeuge, Best Practices für das Versionsmanagement und Workflows für die Erstellung und Veröffentlichung hochwertiger Python-Pakete untersuchen.
Warum sollten Sie Ihr Python-Paket verteilen?
Die Verteilung Ihres Python-Pakets bietet zahlreiche Vorteile:
- Teilen Sie Ihre Arbeit: Ermöglicht anderen Entwicklern, Ihren Code einfach wiederzuverwenden, was Zusammenarbeit und Innovation fördert. Stellen Sie sich ein globales Team vor, das Ihre in Python erstellten spezialisierten Datenanalyse-Tools verwendet.
- Abhängigkeitsmanagement: Vereinfacht den Prozess der Verwaltung von Abhängigkeiten in anderen Projekten. Ihr Paket kann mit einem einzigen Befehl zusammen mit all seinen Abhängigkeiten installiert werden.
- Beitrag zu Open Source: Ermöglicht es Ihnen, zur Open-Source-Community beizutragen und Anerkennung für Ihre Arbeit zu erhalten. Viele kritische Softwarekomponenten sind Open-Source-Pakete, die von Entwicklern weltweit gepflegt werden.
- Versionskontrolle und Updates: Bietet eine strukturierte Möglichkeit, Versionen zu verwalten, Updates zu veröffentlichen und Fehlerbehebungen durchzuführen. Dies stellt sicher, dass Benutzer immer Zugriff auf die neueste und zuverlässigste Version Ihres Pakets haben.
- Einfache Installation: Vereinfacht die Installation fĂĽr Benutzer durch `pip install ihr-paketname`.
Wesentliche Werkzeuge fĂĽr die Verteilung von Python-Paketen
Mehrere Werkzeuge sind für die Erstellung und Verteilung von Python-Paketen unerlässlich:
- setuptools: Eine weit verbreitete Bibliothek zur Definition von Paket-Metadaten, einschließlich Name, Version, Abhängigkeiten und Einstiegspunkten. Es ist der De-facto-Standard für die Paketierung von Python-Projekten.
- wheel: Ein Distributionsformat, das einen effizienteren und zuverlässigeren Installationsprozess im Vergleich zu Quelldistributionen bietet. Wheels sind vorgefertigte Distributionen, die ohne Kompilierung installiert werden können.
- twine: Ein Werkzeug zum sicheren Hochladen Ihres Pakets auf PyPI. Twine verschlüsselt Ihre Anmeldeinformationen und Paketdaten während der Übertragung und schützt so vor Abhören und Man-in-the-Middle-Angriffen.
- venv/virtualenv: Dies sind Werkzeuge zur Erstellung isolierter Python-Umgebungen. Die Verwendung virtueller Umgebungen ist entscheidend für die Verwaltung von Abhängigkeiten und die Vermeidung von Konflikten zwischen verschiedenen Projekten.
Einrichten Ihres Projekts
Bevor Sie Ihr Paket verteilen können, müssen Sie Ihr Projekt korrekt strukturieren.
Beispiel fĂĽr eine Projektstruktur
mein_paket/ ├── mein_paket/ │ ├── __init__.py │ ├── modul1.py │ └── modul2.py ├── tests/ │ ├── __init__.py │ ├── test_modul1.py │ └── test_modul2.py ├── README.md ├── LICENSE ├── setup.py └── .gitignore
Erklärung:
- mein_paket/: Das Hauptverzeichnis, das den Quellcode Ihres Pakets enthält.
- mein_paket/__init__.py: Macht das Verzeichnis `mein_paket` zu einem Python-Paket. Es kann leer sein oder Initialisierungscode enthalten.
- mein_paket/modul1.py, mein_paket/modul2.py: Ihre Python-Module, die den eigentlichen Code enthalten.
- tests/: Ein Verzeichnis, das Ihre Unit-Tests enthält. Es ist entscheidend, Tests zu schreiben, um die Qualität und Zuverlässigkeit Ihres Pakets sicherzustellen.
- README.md: Eine Markdown-Datei, die eine Beschreibung Ihres Pakets, Anwendungsanweisungen und andere relevante Informationen enthält. Dies ist oft das Erste, was Benutzer auf PyPI sehen.
- LICENSE: Eine Datei, die die Lizenz enthält, unter der Ihr Paket verteilt wird (z. B. MIT, Apache 2.0, GPL). Die Wahl einer geeigneten Lizenz ist wesentlich, um festzulegen, wie andere Ihren Code verwenden können.
- setup.py: Die Hauptkonfigurationsdatei, die die Metadaten Ihres Pakets und die Anweisungen zum Erstellen definiert.
- .gitignore: Gibt Dateien und Verzeichnisse an, die von Git ignoriert werden sollen (z. B. temporäre Dateien, Build-Artefakte).
Erstellen der `setup.py`-Datei
Die Datei `setup.py` ist das Herzstück Ihrer Paketverteilung. Sie enthält Metadaten über Ihr Paket und Anweisungen zum Erstellen und Installieren. Hier ist ein Beispiel:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="mein_paket", # Ersetzen Sie dies durch Ihren Paketnamen
version="0.1.0",
author="Ihr Name", # Ersetzen Sie dies durch Ihren Namen
author_email="ihre.email@example.com", # Ersetzen Sie dies durch Ihre E-Mail-Adresse
description="Ein kleines Beispielpaket",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/ihrbenutzername/mein_paket", # Ersetzen Sie dies durch die URL Ihres Repositorys
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[
"requests", # Beispiel-Abhängigkeit
],
)
Erklärung:
- name: Der Name Ihres Pakets, der auf PyPI verwendet wird. Wählen Sie einen einzigartigen und beschreibenden Namen.
- version: Die Versionsnummer Ihres Pakets. Folgen Sie der semantischen Versionierung (siehe unten).
- author, author_email: Ihr Name und Ihre E-Mail-Adresse.
- description: Eine kurze Beschreibung Ihres Pakets.
- long_description: Eine längere, detailliertere Beschreibung, die typischerweise aus Ihrer `README.md`-Datei gelesen wird.
- long_description_content_type: Gibt das Format Ihrer langen Beschreibung an (z. B. "text/markdown").
- url: Die URL der Homepage Ihres Pakets (z. B. GitHub-Repository).
- packages: Eine Liste von Paketen, die in Ihre Distribution aufgenommen werden sollen. `setuptools.find_packages()` findet automatisch alle Pakete in Ihrem Projekt.
- classifiers: Metadaten, die Benutzern helfen, Ihr Paket auf PyPI zu finden. Wählen Sie geeignete Klassifikatoren aus der Liste der Trove Classifiers. Erwägen Sie die Aufnahme von Klassifikatoren für unterstützte Python-Versionen, Betriebssysteme und Lizenzen.
- python_requires: Gibt die mindestens erforderliche Python-Version zur Verwendung Ihres Pakets an.
- install_requires: Eine Liste von Abhängigkeiten, die Ihr Paket benötigt. Diese Abhängigkeiten werden automatisch installiert, wenn Ihr Paket installiert wird.
Versionsmanagement: Semantische Versionierung
Semantische Versionierung (SemVer) ist ein weit verbreitetes Versionierungsschema, das eine klare und konsistente Möglichkeit bietet, die Art der Änderungen in Ihrem Paket zu kommunizieren.
Eine SemVer-Versionsnummer besteht aus drei Teilen: MAJOR.MINOR.PATCH.
- MAJOR: Wird erhöht, wenn Sie inkompatible API-Änderungen vornehmen. Dies deutet auf eine signifikante Änderung hin, die möglicherweise erfordert, dass Benutzer ihren Code aktualisieren.
- MINOR: Wird erhöht, wenn Sie Funktionalität auf abwärtskompatible Weise hinzufügen. Dies signalisiert neue Funktionen oder Verbesserungen, die den vorhandenen Code nicht brechen.
- PATCH: Wird erhöht, wenn Sie abwärtskompatible Fehlerbehebungen vornehmen. Dies ist für kleine Korrekturen, die keine neuen Funktionen hinzufügen oder die bestehende Funktionalität beeinträchtigen.
Beispiele:
- 1.0.0: Erstveröffentlichung.
- 1.1.0: Eine neue Funktion wurde hinzugefügt, ohne den bestehenden Code zu beeinträchtigen.
- 1.0.1: Ein Fehler in der Version 1.0.0 wurde behoben.
- 2.0.0: Inkompatible API-Änderungen wurden vorgenommen.
Die Verwendung von SemVer hilft Benutzern, die Auswirkungen eines Upgrades auf eine neue Version Ihres Pakets zu verstehen.
Erstellen Ihres Pakets
Sobald Sie Ihre `setup.py`-Datei konfiguriert haben, können Sie Ihr Paket erstellen.
- Erstellen Sie eine virtuelle Umgebung: Es wird dringend empfohlen, eine virtuelle Umgebung zu erstellen, um die Abhängigkeiten Ihres Pakets zu isolieren. Verwenden Sie `python3 -m venv .venv` (oder `virtualenv .venv`) und aktivieren Sie sie dann (`source .venv/bin/activate` unter Linux/macOS, `.venv\Scripts\activate` unter Windows).
- Installieren Sie Build-Abhängigkeiten: Führen Sie `pip install --upgrade setuptools wheel` aus.
- Erstellen Sie das Paket: FĂĽhren Sie `python setup.py sdist bdist_wheel` aus. Dieser Befehl erstellt zwei Distributionsdateien im Verzeichnis `dist`: eine Quelldistribution (sdist) und eine Wheel-Distribution (bdist_wheel).
Die `sdist` enthält Ihren Quellcode und die `setup.py`-Datei. Die `bdist_wheel` ist eine vorgefertigte Distribution, die schneller installiert werden kann.
Veröffentlichen Ihres Pakets auf PyPI
Bevor Sie Ihr Paket veröffentlichen können, müssen Sie ein Konto auf PyPI (https://pypi.org/) erstellen und einen API-Token anlegen. Dieser Token wird zur Authentifizierung Ihrer Uploads verwendet.
- Registrieren Sie sich auf PyPI: Gehen Sie zu https://pypi.org/account/register/ und erstellen Sie ein Konto.
- Erstellen Sie einen API-Token: Gehen Sie zu https://pypi.org/manage/account/, scrollen Sie zum Abschnitt "API tokens" und erstellen Sie einen neuen Token. Bewahren Sie diesen Token sicher auf, da Sie ihn zum Hochladen Ihres Pakets benötigen.
- Installieren Sie Twine: FĂĽhren Sie `pip install twine` aus.
- Laden Sie Ihr Paket hoch: FĂĽhren Sie `twine upload dist/*` aus. Sie werden nach Ihrem Benutzernamen (
__token__) und Ihrem Passwort (dem von Ihnen erstellten API-Token) gefragt.
Wichtiger Sicherheitshinweis: Committen Sie niemals Ihren API-Token in Ihr Repository. Speichern Sie ihn sicher und verwenden Sie Umgebungsvariablen oder andere sichere Methoden, um während des Upload-Prozesses darauf zuzugreifen.
Testen Ihrer Paketinstallation
Nachdem Sie Ihr Paket veröffentlicht haben, ist es wichtig zu testen, ob es korrekt installiert werden kann.
- Erstellen Sie eine neue virtuelle Umgebung: Dies stellt sicher, dass Sie die Installation in einer sauberen Umgebung testen.
- Installieren Sie Ihr Paket: FĂĽhren Sie `pip install ihr-paketname` aus.
- Importieren und verwenden Sie Ihr Paket: Importieren Sie in einem Python-Interpreter Ihr Paket und ĂĽberprĂĽfen Sie, ob es wie erwartet funktioniert.
Continuous Integration und Continuous Deployment (CI/CD)
Um den Prozess des Erstellens, Testens und Veröffentlichens Ihres Pakets zu automatisieren, können Sie CI/CD-Tools wie GitHub Actions, GitLab CI oder Travis CI verwenden.
Hier ist ein Beispiel für einen GitHub Actions-Workflow, der Ihr Paket erstellt und auf PyPI veröffentlicht:
name: Publish to PyPI
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package
run: python setup.py sdist bdist_wheel
- name: Publish package to PyPI
run: |
twine upload dist/* \
-u __token__ \
-p ${{ secrets.PYPI_API_TOKEN }}
Erklärung:
- Dieser Workflow wird ausgelöst, wenn ein neues Release auf GitHub veröffentlicht wird.
- Er checkt den Code aus, richtet Python ein, installiert Abhängigkeiten, erstellt das Paket und lädt es auf PyPI hoch.
- Das
secrets.PYPI_API_TOKENist ein GitHub-Secret, das Ihren PyPI-API-Token speichert. Sie mĂĽssen dieses Secret in den Einstellungen Ihres GitHub-Repositorys konfigurieren.
Best Practices fĂĽr die Verteilung von Python-Paketen
- Schreiben Sie eine umfassende Dokumentation: Fügen Sie eine detaillierte `README.md`-Datei sowie eine API-Dokumentation mit Tools wie Sphinx hinzu. Eine klare und vollständige Dokumentation ist entscheidend, um die Verwendung Ihres Pakets zu erleichtern.
- Schreiben Sie Unit-Tests: Testen Sie Ihren Code gründlich, um seine Qualität und Zuverlässigkeit sicherzustellen. Verwenden Sie ein Test-Framework wie pytest oder unittest.
- Befolgen Sie die PEP 8-Stilrichtlinien: Halten Sie sich an den Python Enhancement Proposal 8 (PEP 8) Style Guide, um konsistenten und lesbaren Code zu gewährleisten.
- Verwenden Sie eine Lizenz: Wählen Sie eine geeignete Open-Source-Lizenz, um festzulegen, wie andere Ihren Code verwenden können.
- Halten Sie Ihre Abhängigkeiten auf dem neuesten Stand: Aktualisieren Sie regelmäßig die Abhängigkeiten Ihres Pakets, um von Fehlerbehebungen, Sicherheitspatches und neuen Funktionen zu profitieren.
- Verwenden Sie eine virtuelle Umgebung: Entwickeln und testen Sie Ihr Paket immer in einer virtuellen Umgebung, um Abhängigkeiten zu isolieren.
- Berücksichtigen Sie Internationalisierung (i18n) und Lokalisierung (l10n): Wenn Ihr Paket benutzerorientierten Text oder Daten verarbeitet, erwägen Sie, es an verschiedene Sprachen und Regionen anpassbar zu machen. Dies erweitert Ihre potenzielle Benutzerbasis weltweit. Tools wie Babel können dabei helfen.
- Umgang mit verschiedenen Zeitzonen und Währungen: Wenn Ihr Paket mit Daten, Uhrzeiten oder Finanztransaktionen zu tun hat, achten Sie auf unterschiedliche Zeitzonen und Währungen auf der ganzen Welt. Verwenden Sie geeignete Bibliotheken und APIs, um diese Komplexitäten korrekt zu handhaben.
- Geben Sie klare Fehlermeldungen aus: Schreiben Sie informative Fehlermeldungen, die den Benutzern helfen zu verstehen, was schief gelaufen ist und wie sie es beheben können. Übersetzen Sie diese Fehlermeldungen nach Möglichkeit in verschiedene Sprachen.
- Denken Sie an Barrierefreiheit: Berücksichtigen Sie bei der Gestaltung der Benutzeroberfläche und Dokumentation Ihres Pakets Benutzer mit Behinderungen. Befolgen Sie die Richtlinien zur Barrierefreiheit, um sicherzustellen, dass Ihr Paket von allen genutzt werden kann.
Fortgeschrittene Themen
- Namespace-Pakete: Ermöglichen es Ihnen, ein einzelnes Python-Paket auf mehrere Verzeichnisse oder sogar mehrere Distributionen aufzuteilen.
- Einstiegspunkte (Entry points): Ermöglichen es Ihnen, Funktionen oder Klassen zu definieren, die von anderen Paketen oder von der Befehlszeile aus aufgerufen werden können.
- Datendateien: Ermöglichen es Ihnen, Nicht-Python-Dateien (z. B. Datendateien, Konfigurationsdateien) in Ihre Distribution aufzunehmen.
- Bedingte Abhängigkeiten: Ermöglichen es Ihnen, Abhängigkeiten anzugeben, die nur unter bestimmten Bedingungen erforderlich sind (z. B. auf einem bestimmten Betriebssystem).
Fazit
Die Verteilung Ihres Python-Pakets auf PyPI ist eine großartige Möglichkeit, Ihre Arbeit mit der Welt zu teilen und zum Python-Ökosystem beizutragen. Indem Sie die in diesem Leitfaden beschriebenen Schritte und Best Practices befolgen, können Sie hochwertige Python-Pakete erstellen und veröffentlichen, die einfach zu installieren, zu verwenden und zu warten sind. Denken Sie daran, klare Dokumentation, gründliche Tests und ein konsistentes Versionsmanagement zu priorisieren, um den Erfolg Ihres Pakets sicherzustellen.