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

Python Enhancement Proposals

PEP 704 – Virtuelle Umgebungen für Paketinstallationsprogramme standardmäßig vorschreiben

Autor:
Pradyun Gedam <pradyunsg at gmail.com>
Sponsor:
Brett Cannon <brett at python.org>
PEP-Delegate:
Paul Moore <p.f.moore at gmail.com>
Discussions-To:
Discourse thread
Status:
Zurückgezogen
Typ:
Standards Track
Thema:
Packaging
Erstellt:
16-Jan-2023
Post-History:
16-Jan-2023

Inhaltsverzeichnis

Zusammenfassung

Dieses PEP empfiehlt, dass Paketinstallationsprogramme wie pip ab Python 3.13+ standardmäßig eine virtuelle Umgebung vorschreiben.

Rücknahme eines PEP

Während der Diskussion dieses PEP wurde deutlich, dass Änderungen an der Benutzerfreundlichkeit von pip nicht wie vorgeschlagen durch PEPs gesteuert werden. Es wurde auch deutlich, dass eine erhebliche Anzahl von Benutzern darauf angewiesen ist, von pip verwaltete Abhängigkeiten mit von anderen Tools verwalteten Abhängigkeiten mischen zu können (am prominentesten bei der Verwendung von Conda).

Darüber hinaus ist eine erhebliche Teilmenge der Vorteile der vorgeschlagenen Änderung über PEP 668 (zum Zeitpunkt der Erstellung akzeptiert und implementiert) erreichbar. Es gibt Redistributoren des Python-Interpreters die Kontrolle darüber, ob Benutzer eine virtuelle Umgebung verwenden müssen, welche Meldungen dem Benutzer angezeigt werden und wie die Einführung dieser Änderung für ihre Benutzer erfolgen soll.

Da die Durchsetzung virtueller Umgebungen mit pip der Hauptfokus dieses PEP war, erschien es angemessener, dieses PEP zurückzuziehen, anstatt es auf ein anderes Thema zu fokussieren.

Ein zukünftiges PEP zur Klärung der Namenskonvention/Probleme für virtuelle Umgebungen wäre weiterhin angemessen, aber es lohnt sich, jede solche Anstrengung als neues PEP zu beginnen, das sich auf die Vorteile einer solchen Konvention konzentriert, anstatt auf deren Durchsetzung.

Motivation

Python virtuelle Umgebungen sind ein wesentlicher Bestandteil des Entwicklungs-Workflows für Python. Sie erfordern jedoch zusätzlichen Aufwand, da sie eine Opt-in-Funktion sind und erfordern, dass Benutzer entweder

  • explizite Schritte zur Aktivierung/Deaktivierung einer virtuellen Umgebung unternehmen
  • <pfad-zur-venv>/<bin-pfad>/<ausführbare-datei> verwenden, um Dateien auszuführen

Für neue Benutzer scheinen die Dinge korrekt zu funktionieren, wenn keine virtuellen Umgebungen verwendet werden – bis sie es nicht mehr tun. Darüber hinaus verwendet die Aktivierung einer virtuellen Umgebung auf verschiedenen Plattformen leicht unterschiedliche Syntax und Mechanismen. Dies erschwert die Einführung in virtuelle Umgebungen, da nun Informationen und Kontext darüber, wie/warum sie nützlich sind, erklärt werden müssen, um die zusätzlichen Schritte im Workflow zu rechtfertigen.

Es schafft auch Raum für Fehler, da Benutzer sich daran erinnern müssen, die virtuelle Umgebung zu aktivieren, bevor sie einen Installer wie pip ausführen, oder diese Installer so konfigurieren, dass sie fehlschlagen. Auf bestimmten Linux-Distributionen kann das Vergessen dieses Schritts dazu führen, dass der Installer Dateien modifiziert, die dem Betriebssystem gehören (was teilweise durch PEP 668 für Distributionen gemildert wird, die sich für die entsprechende Kennzeichnung ihrer Umgebungen entscheiden).

Begründung

Die Änderung des Standardverhaltens von Installern wie pip, um die Aktivierung einer virtuellen Umgebung vorzuschreiben, würde

  • es neuen Benutzern erleichtern, mit Python zu beginnen (da es eine konsistente Erfahrung gibt und virtuelle Umgebungen als etwas verstanden werden, das Sie verwenden müssen)
  • das Risiko versehentlicher Installationsprobleme für alle Benutzer standardmäßig reduzieren (indem explizit signalisiert wird, wenn Sie keine virtuelle Umgebung verwenden).

Das Festlegen einer Konvention, die virtuelle Umgebung im Verzeichnisbaum unter einem Verzeichnis namens .venv abzulegen, entfernt einen Entscheidungspunkt für gängige Workflows und schafft eine klare Konvention im Ökosystem.

Spezifikation

Standardmäßiges Vorgeben einer virtuellen Umgebung

Wenn ein Benutzer einen Installer ohne aktive virtuelle Umgebung ausführt, SOLLTE der Installer eine Fehlermeldung ausgeben und mit einem Exit-Code ungleich Null beenden.

Die Fehlermeldung SOLLTE den Benutzer darüber informieren, dass eine virtuelle Umgebung erforderlich ist, SOLLTE spezifische Anweisungen für die Shell bereitstellen, wie eine virtuelle Umgebung namens .venv erstellt und aktiviert wird, und SOLLTE einen Link zu einer Dokumentationsseite bereitstellen, die erklärt, wie eine virtuelle Umgebung erstellt und aktiviert wird.

Siehe Implementierungshinweise für weitere Details.

Deaktivieren von virtuellen Umgebungen

Der Installer SOLLTE auch eine explizite Opt-in-Option zur Deaktivierung dieser Anforderung bereitstellen, die es einem Endbenutzer ermöglicht, ihn außerhalb einer virtuellen Umgebung zu verwenden. Wenn der Installer diese Funktionalität nicht bereitstellt, SOLLTE er dies in der Fehlermeldung und auf der Dokumentationsseite erwähnen.

Konsistenter Zeitplan für die Änderung

Installer KÖNNEN dieses Standardverhalten für beliebige Python-Versionen implementieren, SOLLTEN es aber für Python 3.13 oder neuer implementieren.

Abwärtskompatibilität

Dieses PEP ist rückwärtskompatibel mit Arbeitsabläufen, bei denen Benutzer Installer außerhalb von virtuellen Umgebungen verwenden. Solche Benutzer werden mit einer Fehlermeldung aufgefordert und müssen entweder

  • explizit die Ausführung des Installers außerhalb einer virtuellen Umgebung zulassen, oder
  • eine virtuelle Umgebung erstellen und verwenden

Benutzer, die bereits virtuelle Umgebungen verwenden, sind von dieser Änderung nicht betroffen.

Workflow-Tools (die virtuelle Umgebungen für den Benutzer im Hintergrund verwalten) sollten nicht betroffen sein, da sie zur Ausführung des Installers bereits eine virtuelle Umgebung verwenden sollten.

Sicherheitsimplikationen

Dieses PEP führt keine neuen Sicherheitsimplikationen ein.

Wie man das lehrt

Dieses PEP verlangt, dass neue Benutzer eine virtuelle Umgebung erstellen und verwenden, um mit der Verwendung von Python-Paketen zu beginnen. Dies ist jedoch eine bewährte Methode, wie gezeigt wird, im Abschnitt "Grundlagen der Installation von Python-Paketen" im Python Packaging User Guide, der erklärt, wie/was virtuelle Umgebungen sind, bevor die Verwendung von pip besprochen wird.

Referenzimplementierung

Es gibt keine Referenzimplementierung für dieses PEP. Das vorgeschlagene Verhalten ist jedoch weitgehend bereits in pip implementiert und kann durch Setzen der Umgebungsvariable PIP_REQUIRE_VENV auf 1 aktiviert werden. (Das Nichtsetzen führt zum vorgeschlagenen Opt-in-Verhalten, keine virtuelle Umgebung für die Installation zu benötigen.)

Implementierungs-Hinweise

Erkennen einer aktiven virtuellen Umgebung

Wie in PEP 668 diskutiert, ist die Logik für die robuste Erkennung einer virtuellen Umgebung etwa so

def is_virtual_environment():
    return sys.base_prefix != sys.prefix or hasattr(sys, "real_prefix")

Dokumentation zur Verwendung einer virtuellen Umgebung

Paketinstallationsprogramme sind verpflichtet, in der Fehlermeldung einen Link zu einer Dokumentationsseite bereitzustellen.

Idealerweise würde eine solche Dokumentationsseite erklären, was virtuelle Umgebungen sind, warum sie erforderlich sind und wie eine virtuelle Umgebung mit venv erstellt und aktiviert wird. Sie sollte Anweisungen für die gängigsten Shells und Plattformen enthalten.

Eine solche Dokumentationsseite sollte im Python Packaging User Guide verfügbar gemacht werden, um doppelte Bemühungen bei der Abdeckung dieses Themas durch verschiedene Installer zu reduzieren.

Abgelehnte Ideen

Keinen Namen für das Verzeichnis der virtuellen Umgebung angeben

Die Verwendung eines konsistenten Namens für das Verzeichnis der virtuellen Umgebung ist aus mehreren Gründen wichtig

  1. Es macht es Benutzern leichter, das Verzeichnis der virtuellen Umgebung zu finden und zu aktivieren.
  2. Es beseitigt einen Entscheidungspunkt für neue Benutzer, da sie keinen Namen für das Verzeichnis der virtuellen Umgebung festlegen müssen.
  3. Es schafft eine klare Konvention im Ökosystem, was es Benutzern erleichtert, Dokumentationen zu finden.
  4. Es sorgt für Konsistenz zwischen verschiedenen Werkzeugen, sodass Unterschiede in den Fehlermeldungen die Benutzer nicht verwirren.

Einen anderen Namen für das Verzeichnis der virtuellen Umgebung verwenden

Funktional spielt der Verzeichnisname keine große Rolle, solange ein einheitlicher Vorschlag existiert.

Der Name .venv wurde gewählt, da er

  1. nicht mit einem gültigen Python-Importnamen kollidiert
  2. nicht mit dem venv-Modul in der Standardbibliothek kollidiert
  3. eine bestehende Verwendung in der Python-Community hat
  4. Unterstützung für automatische Erkennung in gängigen Texteditoren hat
  5. ohne Modifikatortasten auf gängigen Tastaturlayouts eingegeben werden kann

Verhalten von Werkzeugen nicht an eine Python-Version koppeln

Dieses PEP schafft eine Kopplung zwischen dem Verhalten von Installern und der Python-Version.

Dies ist bereits ein Rollout-Mechanismus, der für Verhaltensänderungen in der Installations-Toolchain verwendet wird. Zum Beispiel verwendet pip unter Python 3.11 importlib.metadata anstelle von pkg_resources zum Parsen/Abrufen von Paketmetadaten und sysconfig anstelle von distutils.sysconfig zum Abrufen der Pfade zum Entpacken von Wheels.

Der Unterschied zu diesen Fällen besteht darin, dass sie für Endbenutzer weitgehend transparent sein sollen. Dieses PEP schlägt eine Verhaltensänderung vor, die für Endbenutzer nicht transparent ist und von ihnen Maßnahmen erfordert.

Der Hauptvorteil besteht darin, dass er es Redistributoren ermöglicht, ihre Werkzeuge rechtzeitig für die neue Python-Version anzupassen, und einen klaren und konsistenten Zeitpunkt für die Änderung im gesamten Ökosystem bietet. Es setzt auch eine klare Frist, wann das Standardverhalten standardmäßig konsistent eine virtuelle Umgebung vorschreiben wird (sobald Python 3.12 das Ende seiner Lebensdauer erreicht hat).

Das Hauptproblem bei diesem Ansatz ist, dass er Benutzern eine Verhaltensänderung aufzwingt, wenn sie auf eine neue Python-Version aktualisieren, was die Akzeptanz einer neuen Python-Version behindern kann. Dies ist jedoch eine Migration/ein Upgrade für bestehende Benutzer, und es ist eine allgemeine Erwartung, dass *einige* Änderungen für Migrationen/Upgrades erforderlich sind.

Der Autor dieses PEP ist der Meinung, dass die Vorteile der konsistenten Anwendung im gesamten Ökosystem mit einer Frist die Nachteile der Erzwingung einer Best Practice bei Benutzern während ihres Upgrades überwiegen.

Offene Fragen

Keine.


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

Zuletzt geändert: 2025-02-01 08:55:40 GMT