Verwenden Sie jetzt das lokale Paketverzeichnis in Python

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 Installationsoption

Es 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.

Source: https://habr.com/ru/post/de444504/


All Articles