Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 439 – Einbindung eines impliziten Pip-Bootstraps in die Python-Installation

Autor:
Richard Jones <richard at python.org>
BDFL-Delegate:
Alyssa Coghlan <ncoghlan at gmail.com>
Discussions-To:
Distutils-SIG Liste
Status:
Abgelehnt
Typ:
Standards Track
Thema:
Packaging
Erstellt:
18. Mrz. 2013
Python-Version:
3.4
Post-History:
19. Mrz. 2013
Resolution:
Distutils-SIG Nachricht

Inhaltsverzeichnis

Zusammenfassung

Dieses PEP schlägt die Einbindung eines Pip-Bootstrap-Executables in die Python-Installation vor, um die Nutzung von 3rd-Party-Modulen durch Python-Benutzer zu vereinfachen.

Dieses PEP schlägt nicht vor, die Pip-Implementierung in die Python-Standardbibliothek aufzunehmen. Ebenso schlägt es keine Paketverwaltung oder Installationsmechanismen über die von PEP 427 („Das Wheel Binärpaketformat 1.0“) und das TODO-Distlib-PEP bereitgestellten hinaus vor.

Ablehnung der PEP

Dieses PEP wurde zugunsten eines expliziteren Mechanismus abgelehnt, der auf zuverlässigere Weise dasselbe Endergebnis erzielen soll. Der explizitere Bootstrap-Mechanismus ist in PEP 453 beschrieben.

Begründung

Derzeit ist das User-Story für die Installation von 3rd-Party-Python-Modulen nicht so einfach, wie es sein könnte. Es erfordert, dass alle 3rd-Party-Module den Benutzer darüber informieren, wie der Installer installiert wird, typischerweise über einen Link zum Installer. Dieser Link kann veraltet sein, oder die Schritte zur Installation des Installers können ein ausreichendes Hindernis darstellen, um den Benutzer von weiteren Fortschritten abzuhalten.

Große Python-Projekte, die eine niedrige Einstiegshürde betonen, haben sich von Abhängigkeiten von Drittanbieterpaketen ferngehalten, da dies für neue Benutzer zu einem potenziellen Stolperstein werden kann.

Mit der Einbindung des Paketinstaller-Befehls in die Standard-Python-Installation wird die Hürde für die Installation zusätzlicher Software erheblich reduziert. Es wird gehofft, dass dies daher die Wahrscheinlichkeit erhöht, dass Python-Projekte Software von Drittanbietern wiederverwenden.

Die Python-Community hat auch ein Problem mit der Komplexität des aktuellen Bootstrap-Verfahrens für Pip und Setuptools. Sie alle haben ihre eigenen Bootstrap-Download-Dateien mit leicht unterschiedlichen Verwendungen und verweisen teilweise sogar aufeinander. Ein einziger Bootstrap, der für alle gemeinsam ist und eine einfache Verwendung hat, wäre weitaus vorzuziehen.

Es wird auch gehofft, dass dies die Anzahl der Vorschläge zur Aufnahme von immer mehr Software in die Python-Standardbibliothek reduziert und dass daher beliebtere Python-Software einfacher aktualisiert werden kann, als dies über Python-Installations-Upgrades hinaus erforderlich ist.

Vorschlag

Der Bootstrap installiert die Pip-Implementierung und Setuptools, indem er deren Installationsdateien von PyPI herunterlädt.

Dieser Vorschlag betrifft zwei Komponenten des Paketierens: den Pip-Bootstrap und, dank einfacherer Paketinstallation, Änderungen bei der Veröffentlichung von Paketen.

Der Kern dieses Vorschlags ist, dass die Benutzererfahrung bei der Verwendung von Pip nicht erfordert, dass der Benutzer Pip installiert.

Der Pip-Bootstrap

Die Python-Installation enthält ein ausführbares Programm namens „pip3“ (siehe PEP 394 für Namensbegründung usw.), das versucht, die Pip-Mechanismen zu importieren. Wenn dies gelingt, wird der Pip-Befehl normal ausgeführt. Wenn nicht, bootstappt er Pip, indem er die Pip-Implementierung und die Setuptools-Wheel-Dateien herunterlädt. Im Folgenden impliziert die Installation der „Pip-Implementierung“ die Installation von Setuptools und Virtualenv. Nach der Installation verfährt der Pip-Befehl normal. Sobald der Bootstrap-Prozess abgeschlossen ist, ist der „pip3“-Befehl nicht mehr der Bootstrap, sondern der vollständige Pip-Befehl.

Ein Bootstrap wird anstelle des vollständigen Pip-Codes verwendet, damit wir Pip nicht bündeln müssen und Pip außerhalb des regulären Python-Upgrade-Zeitrahmens und der Prozesse aktualisierbar ist.

Um Probleme mit „sudo“ zu vermeiden, wird der Bootstrap standardmäßig die Pip-Implementierung im benutzerspezifischen site-packages-Verzeichnis installieren, das in PEP 370 definiert und in Python 2.6/3.0 implementiert ist. Da wir nicht in das System-Python installieren, vermeiden wir auch Konflikte mit anderen Paketierungssystemen (z. B. unter Linux). Wenn sich der Benutzer in einer PEP 405 virtuellen Umgebung befindet, wird die Pip-Implementierung in diese virtuelle Umgebung installiert.

Der Bootstrap-Prozess wird wie folgt ablaufen

  1. Das Benutzersystem hat Python (3.4+) installiert. Im „scripts“-Verzeichnis der Python-Installation befindet sich das Bootstrap-Skript namens „pip3“.
  2. Der Benutzer wird einen Pip-Befehl aufrufen, typischerweise „pip3 install <package>“, zum Beispiel „pip3 install Django“.
  3. Das Bootstrap-Skript versucht, die Pip-Implementierung zu importieren. Wenn dies gelingt, wird der Pip-Befehl normal verarbeitet. Stopp.
  4. Bei einem Fehler beim Import der Pip-Implementierung benachrichtigt der Bootstrap den Benutzer, dass er „pip installieren“ muss. Er fragt den Benutzer, ob er Pip als systemweite site-packages oder als benutzerdefinierte Paket installieren soll. Diese Wahl wird auch als Kommandozeilenoption für Pip verfügbar sein, so dass eine nicht-interaktive Nutzung möglich ist.
  5. Der Bootstrap kontaktiert PyPI, um die neueste Download-Wheel-Datei zu erhalten (siehe PEP 427).
  6. Nach dem Herunterladen der Datei wird sie mit „python setup.py install“ installiert.
  7. Das Pip-Tool kann nun die Pip-Implementierung importieren und fährt fort, den angeforderten Benutzerbefehl normal zu verarbeiten.

Benutzer können in einer Umgebung arbeiten, die keinen Zugriff auf das öffentliche Internet hat und sich ausschließlich auf ein lokales Paketrepository verlässt. Sie würden das Argument „-i“ (Basis-URL des Python Package Index) zum Befehl „pip3 install“ verwenden. Dies überschreibt einfach die Standard-Index-URL, die auf PyPI verweist.

Einige Benutzer haben möglicherweise keinen Internetzugang, der für das Herunterladen der Pip-Implementierungsdatei geeignet ist. Diese Benutzer können die Tar-Dateien von Setuptools und Pip manuell herunterladen und installieren. Die Hinzufügung spezifischer Unterstützung für diesen Anwendungsfall ist nicht notwendig.

Der Download der Pip-Implementierungsinstallationsdatei erfolgt sicher. Der Transport von pypi.python.org erfolgt über HTTPS mit der CA-Zertifikatsprüfung. Diese Funktion wird in Python 3.4+ unter Verwendung von Betriebssystemzertifikaten vorhanden sein (siehe PEP XXXX).

Über die Argumente hinaus, die den Indexstandort und die Download-Optionen steuern, kann der „pip3“-Bootstrap-Befehl weitere Standard-Pip-Optionen für Ausführlichkeit, Stille und Protokollierung unterstützen.

Der „pip3“-Befehl unterstützt zwei neue Kommandozeilenoptionen, die beim Bootstrapping verwendet und andernfalls ignoriert werden. Sie steuern, wo die Pip-Implementierung installiert wird

--bootstrap
Installation im Verzeichnis der Benutzerpakete. Der Name dieser Option wird gewählt, um sie als bevorzugte Installationsoption zu fördern.
--bootstrap-to-system
Installation im Verzeichnis der System-site-packages.

Diese Kommandozeilenoptionen müssen auch in der Pip-Implementierung implementiert, aber andernfalls ignoriert werden.

Es sollte in Betracht gezogen werden, Pip standardmäßig so zu konfigurieren, dass Pakete im Verzeichnis der Benutzerpakete installiert werden, wenn Pip an diesem Ort installiert ist.

Die Option „–no-install“ des Befehls „pip3“ hat keine Auswirkungen auf den Bootstrap-Prozess.

Änderungen bei der Veröffentlichung von Paketen

Ein zusätzliches neues Python-Paket wird vorgeschlagen, „pypublish“, das ein Werkzeug zum Veröffentlichen von Paketen auf PyPI sein wird. Es würde die aktuellen Distutils-Befehle „python setup.py register“ und „python setup.py upload“ ersetzen. Wiederum wegen des gemessenen Python-Release-Zyklus und der umfangreichen bestehenden Python-Installationen sind diese Befehle schwierig zu beheben und zu erweitern. Zusätzlich ist gewünscht, dass die Befehle „register“ und „upload“ über HTTPS mit Zertifikatsvalidierung durchgeführt werden können. Da die Verteilung von CA-Zertifikat-Schlüsselbünden mit Python nicht wirklich machbar ist (die Aktualisierung des Schlüsselbunds ist sehr schwer zu verwalten), ist es wünschenswert, dass diese Befehle und der dazugehörige Schlüsselbund außerhalb von Python selbst installiert und aktualisiert werden können.

Die bestehenden Distutils-Mechanismen für die Paketregistrierung und den Upload würden beibehalten, jedoch mit einer Deprecation-Warnung.

Implementierung

Die von diesem PEP geforderten Änderungen an Pip werden in der Issue-Liste dieses Projekts verfolgt [2]. Insbesondere die Hinzufügung von –bootstrap und –bootstrap-to-system zur Kommandozeile von Pip.

Es wäre wünschenswert, dass die Projekte Pip und Setuptools einen Download im Wheel-Format verteilen.

Der erforderliche Code für diese Implementierung ist der oben beschriebene „pip3“-Befehl. Das zusätzliche pypublish kann außerhalb des Rahmens der Arbeiten dieses PEP entwickelt werden.

Schließlich wäre es wünschenswert, dass „pip3“ auf Python 2.6+ portiert wird, um den einzelnen Befehl zu ermöglichen, die bestehenden Bootstrap-Skripte von Pip, Setuptools und Virtualenv (die zum Bootstrap hinzugefügt würden) zu ersetzen. Die Einbindung dieses Bootstraps in eine zukünftige Python 2.7-Version wäre ebenfalls sehr wünschenswert.

Risiken

Der Schlüssel, der zur Signierung des Downloads der Pip-Implementierung verwendet wird, könnte kompromittiert werden, und dieses PEP schlägt derzeit keinen Mechanismus für die Schlüsselwiderrufung vor.

Es gibt ein Perl-Paket namens „pip“. Es ist ziemlich selten und wird nicht häufig verwendet. Die Fedora-Variante von Linux hat historisch Pythons „pip“ als „python-pip“ und Perls „pip“ als „perl-pip“ bezeichnet. Diese Richtlinie wurde geändert[3], so dass zukünftige und aktualisierte Fedora-Installationen den Namen „pip“ für Pythons „pip“ verwenden werden. Bestehende (nicht aktualisierte) Installationen werden weiterhin den alten Namen für das Python-„pip“ haben, obwohl das Potenzial für Verwechslungen nun deutlich reduziert ist.

Referenzen

Danksagungen

Alyssa Coghlan für ihre Gedanken zum Vorschlag und die Behandlung des Red Hat-Problems.

Jannis Leidel und Carl Meyer für ihre Gedanken. Marcus Smith für Feedback.

Marcela Mašláňová für die Lösung des Fedora-Problems.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0439.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT