In Python 3.8 wird vorgeschlagen, eine Alternative zu virtuellen Umgebungen hinzuzufügen - ein lokales Verzeichnis mit PEP 582-Paketen Python-Paketverzeichnis für lokale Pakete .
In diesem PEP wird vorgeschlagen, einen Mechanismus hinzuzufügen, mit dem __pypackages__
Verzeichnis __pypackages__
in Python automatisch __pypackages__
und beim Import als Quelle für installierte Pakete verwendet wird. Das Verzeichnis __pypackages__
hat beim Import eine höhere Priorität als globale oder benutzerdefinierte Paketverzeichnisse. Dies verhindert das Erstellen, Aktivieren oder Deaktivieren von virtuellen Umgebungen.
So __pypackages__
die __pypackages__
mit __pypackages__
in Python 3.8 aus:
foo __pypackages__ 3.8 lib bottle myscript.py
In diesem Artikel werde ich Ihnen zeigen, wie Sie das lokale Verzeichnis mit Paketen verwenden, ohne auf das Beenden von Python 3.8 zu warten.
Dieser Artikel beschreibt ein grundlegendes Beispiel, das unter Linux, Python 3.5, getestet wurde. Für andere Plattformen müssen Sie möglicherweise Änderungen vornehmen.
Pakete in einem lokalen Verzeichnis installieren
Die Installation entspricht fast der Installation von Paketen mit pip, mit Ausnahme der Option --target
. Darin geben wir den vollständigen oder relativen Pfad zum Verzeichnis mit lokalen Paketen an.
pip3 install --target="$PWD/__pypackages__/3.5/lib/" bar
$ PWD ist eine Variable mit dem aktuellen Arbeitsverzeichnis.
Der folgende Verzeichnisbaum wird erstellt:
foo __pypackages__ 3.5 lib bar myscript.py
Die Python-Version und die Unterverzeichnisse müssen manuell angegeben werden.
Es kann auch Probleme geben, wenn Sie Pakete mit Binärcode und für verschiedene Architekturen installieren müssen. Ich hatte solche Pakete nicht, aber als Lösung können Sie der Verzeichnisstruktur mehr Architektur hinzufügen.
Eine weitere InstallationsoptionEs gibt eine andere Möglichkeit, Pakete in einem bestimmten Verzeichnis zu installieren:
pip3 install --ignore-installed --install-option="--prefix=$PWD/__pypackages__" --install-option="--no-compile" bar
Sie müssen jedoch den vollständigen Pfad zum Installationsort angeben, und der Verzeichnisbaum unterscheidet sich von dem in PEP 582 vorgeschlagenen:
foo __pypackages__ lib python3.5 site-packages bar myscript.py
Verwenden des lokalen Verzeichnisses mit Paketen
Nach der Installation der Pakete muss dem Interpreter mitgeteilt werden, wo nach Abhängigkeiten gesucht werden soll.
sys.path
Sie dazu den Pfad zum lokalen Verzeichnis mit Paketen zur Liste sys.path
. Es reicht aus, den Pfad zum Hauptmodul (zuerst geladen) hinzuzufügen, ein Hinzufügen zum Rest ist nicht erforderlich. Danach können Sie lokal installierte Pakete importieren.
import os import sys _PATH = '/__pypackages__/3.5/lib/' sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + _PATH) import bar
Die einzige Bedingung ist, dass sich das Hauptmodul auf derselben Verschachtelungsebene wie das Verzeichnis __pypackages__
.
Eine andere Möglichkeit, Python mitzuteilen, wo nach Paketen gesucht werden soll, besteht darin, vor dem Ausführen des Skripts eine Umgebungsvariable festzulegen.
PYTHONPATH="$PWD/__pypackages__/3.5/lib/:$PYTHONPATH" python3 ./myscript.py
Auf so einfache Weise können Sie jetzt Funktionen erreichen, die denen von PEP 582 ähneln.