Haben Sie jemals darüber nachgedacht, wie Bibliotheken in virtuellen Umgebungen in Python funktionieren? In diesem Artikel möchte ich mich mit dem Hauptkonzept vertraut machen, das alle Bibliotheken für Umgebungen verwenden, z. B. virtualenv, virtualenvwrapper, conda, pipenv.
Ursprünglich gab es in Python keine integrierte Möglichkeit, Umgebungen zu erstellen, und diese Funktion wurde als Hack implementiert. Wie sich herausstellte, basieren alle Bibliotheken auf einer sehr einfachen Funktion des Python-Interpreters.
Wenn Python den Interpreter startet, sucht es nach dem Verzeichnis mit den Modulen (Site-Paketen). Die Suche beginnt mit dem übergeordneten Verzeichnis bezüglich des physischen Speicherorts der ausführbaren Interpreter-Datei (python.exe). Wenn der Modulordner nicht gefunden wird, geht Python eine Ebene höher und dies, bis das Stammverzeichnis erreicht ist. Um zu verstehen, dass dies ein Verzeichnis mit Modulen ist, sucht Python nach dem Betriebssystemmodul, das sich in der Datei os.py befinden muss und erforderlich ist, damit Python funktioniert.
Stellen wir uns vor, unser Interpreter befindet sich unter
/usr/dev/lang/bin/python
. Dann sehen die Suchpfade folgendermaßen aus:
/usr/dev/lang/lib/python3.7/os.py /usr/dev/lib/python3.7/os.py /usr/lib/python3.7/os.py /lib/python3.7/os.py
Wie Sie sehen können, fügt
lib/python$VERSION/os.py
unserem Pfad ein spezielles Präfix (
lib/python$VERSION/os.py
) hinzu. Sobald der Interpreter die erste Übereinstimmung findet (das Vorhandensein der Datei os.py), ändert er
sys.prefix
und
sys.exec_prefix
in diesen Pfad (wobei das Präfix entfernt wird). Wenn aus irgendeinem Grund keine Übereinstimmungen gefunden werden, wird der Standardpfad verwendet, der in den Interpreter kompiliert wird.
Nun wollen wir sehen, wie es eine der ältesten und bekanntesten Bibliotheken, virtualenv, macht.
user@arb:/usr/home/test
Nach der Ausführung werden zusätzliche Verzeichnisse erstellt:
user@arb:/usr/home/test/ENV
Wie Sie sehen können, wurde die virtuelle Umgebung durch Kopieren der Python-Binärdatei in einen lokalen Ordner (ENV / bin / python) erstellt. Wir können auch feststellen, dass der übergeordnete Ordner
symbolische Links zu den Python-Standardbibliotheksdateien enthält. Wir können keine symbolische Verknüpfung zur ausführbaren Datei erstellen Der Interpreter benennt es weiterhin in den tatsächlichen Pfad um.
Jetzt aktivieren wir unsere Umgebung:
user@arb:/usr/home/test
Dieser Befehl ändert die Umgebungsvariable $ PATH so, dass der
python
Befehl auf unsere lokale Version von Python verweist. Dies wird erreicht, indem der lokale Pfad des Ordners bin am Anfang der Zeile $ PATH ersetzt wird, sodass der lokale Pfad Vorrang vor allen Pfaden auf der rechten Seite hat.
export "/usr/home/test/ENV/bin:$PATH" echo $PATH
Wenn Sie das Skript in dieser Umgebung ausführen, wird es mit der Binärdatei unter
/usr/home/test/ENV/bin/python
. Der Interpreter verwendet diesen Pfad als Ausgangspunkt für die Suche nach Modulen. In unserem Fall befinden sich die Module der Standardbibliothek im Pfad
/usr/home/test/ENV/lib/python3.7/
.
Dies ist der Haupt-Hack, dank dessen alle Bibliotheken für die Arbeit mit virtuellen Umgebungen funktionieren.
Verbesserungen in Python 3
Ab Version Python 3.3 ist ein neuer Standard mit dem Namen
PEP 405 erschienen , der einen neuen Mechanismus für Lightweight-Umgebungen einführt.
Dieser PEP fügt dem Suchprozess einen zusätzlichen Schritt hinzu. Wenn Sie die Konfigurationsdatei
pyenv.cfg
, können Sie anstelle des Kopierens der Python-Binärdatei und aller ihrer Module einfach deren Speicherort in dieser Konfiguration angeben.
Diese Funktion wird vom Standard-
Venv- Modul, das in Python 3 enthalten ist, aktiv verwendet.
user@arb:/usr/home/test2
user@arb:/usr/home/test2
Dank dieser Konfiguration erstellt venv einfach eine Verknüpfung, anstatt die Binärdatei zu kopieren. Wenn der Parameter
include-system-site-packages
in
true
geändert wird, können alle Module der Standardbibliothek automatisch aus der virtuellen Umgebung aufgerufen werden.
Trotz dieser Änderungen verwenden die meisten Bibliotheken von Drittanbietern für die Arbeit mit virtuellen Umgebungen den alten Ansatz.
PS: Ich bin der Autor dieses Artikels, Sie können alle Fragen stellen.