Virtuelle Python-Umgebungen

Überblick

Viele von uns arbeiten gleichzeitig an mehreren Python-Projekten. Mehrere Projekte können von verschiedenen Versionen derselben Bibliothek abhängen. Das ist ein Problem. Selbst wenn Sie mit einem einzelnen Projekt arbeiten und es für die Produktion bereitstellen, kann es zu Problemen kommen, da sich der Python des Systems auf Ihrem Produktionsserver möglicherweise aufgrund eines Betriebssystem-Upgrades oder eines Sicherheitspatches ändert und Ihre Anwendung als Folge fehlschlägt. Im Allgemeinen möchten Sie die vollständige Kontrolle über die Python-Umgebung Ihrer Projekte. Betreten Sie virtuelle Umgebungen…

Die Grundidee einer virtuellen Umgebung besteht darin, einen Python-Interpreter und seine Site-Pakete vom System zu trennen. Sie können auch viele davon haben. Das löst beide Probleme. Sie können für jedes Projekt eine eigene virtuelle Umgebung mit eigenen Abhängigkeiten zuweisen und Konflikte mit anderen Projekten und Python des Systems vergessen.

In diesem Lernprogramm lernen Sie die Konzepte von virtuellen Umgebungen kennen und erfahren, wie Sie diese erstellen und verwenden. Außerdem werden Sie verschiedene Alternativen für spezielle Situationen entdecken.

Virtualenv

Das Paket virtualenv unterstützt dieses Konzept. Sie können virtualenv mit installieren pip install virtualenv.

Sobald virtualenv installiert ist, können Sie virtuelle Umgebungen erstellen. Erstellen wir zwei Umgebungen mit den Namen "venv_1" und "venv_2".

~> virtualenv ~ / venv_1 Reales Präfix verwenden '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7' Neue ausführbare Python-Datei in /Users/gigi/venv_1/bin/python2.7 Erstellen von ausführbaren Dateien in / Users / Gigi / Venv_1 / Bin / Python Installieren von Setuptools, Pip, Wheel ... fertig. ~> virtualenv ~ / venv_2 Verwenden des echten Präfix '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7' Neue ausführbare Python-Datei in /Users/gigi/venv_2/bin/python2.7 Erstellen von ausführbaren Dateien in / Users / gigi / venv_2 / bin / python Installieren von Setuptools, Pip, Wheel ... fertig.

Lass uns nachsehen, was passiert ist.

~> ls -la ~ / venv_1 insgesamt 16 drwxr-xr-x 7 Gigi-Mitarbeiter 238 29. März 23:12. drwxr-xr-x + 254 gigi staff 8636 29. März 23: 12… lrwxr-xr-x 1 gigi staff 79 29. März 23:12 Uhr .Python -> /usr/local/Cellar/python/2.7.10/Frameworks/Python. Rahmen / Versionen / 2.7 / Python drwxr-xr-x 16 Gigi-Stab 544 29. März 23:12 bin drwxr-xr-x 3 Gigi-Stab 102 Mar 29 23:12 einschließlich drwxr-xr-x 3 Gigi-Stab 102 Mar 29 23: 12 lib -rw-r - r-- 1 gigi staff 60 Mar 29 23:12 pip-selfcheck.json

Im Unterverzeichnis "bin" finden Sie einige ausführbare Dateien und Symlinks. Dazu gehören der Python-Interpreter selbst, pip, easy_install und vor allem einige Aktivierungsskripte.

~> ls -la ~ / venv_1 / bin insgesamt 136 drwxr-xr-x 16 Gigi-Mitarbeiter 544 29. März 23:12. drwxr-xr-x 7 Gigi-Mitarbeiter 238 29. März 23: 12… -rw-r - r-- 1 Gigi-Mitarbeiter 2077 29. März 23:12 aktivieren -rw-r - r-- 1 Gigi-Mitarbeiter 1019 29. März 23 : 12 activ.csh -rw-r - r-- 1 Gigi-Stab 2217 29. März 23:12 enable.fish -rw-r - r-- 1 Gigi-Stab 1137 29. März 23:12 aktivieren_this.py -rwxr- xr-x 1 Gigi Mitarbeiter 249 29. März 23:12 easy_install -rwxr-xr-x 1 Gigi Mitarbeiter 249 29. März 23:12 easy_install-2.7 -rwxr-xr-x 1 Gigi Mitarbeiter 221 29. März 23:12 pip -rwxr- xr-x 1 gigi staff 221 29. März 23:12 pip2 -rwxr-xr-x 1 gigi staff 221 29. März 23:12 pip2.7 lrwxr-xr-x 1 gigi staff 9. März 29 23:12 python -> python2. 7 -rwxr-xr-x 1 gigi staff 2336 29. März 23:12 python-config lrwxr-xr-x 1 gigi staff 9 29. März 23:12 python2 -> python2.7 -rwxr-xr-x 1 gigi staff 12744 Mär 29 23:12 python2.7 -rwxr-xr-x 1 gigi staff 228 29. märz 23:12 rad

Das Aktivierungsskript ist der Schlüssel. Um eine bestimmte virtuelle Umgebung zu aktivieren, geben Sie das Aktivierungsskript wie folgt an: source ~ / venv_1 / bin_activate. Der Effekt besteht darin, eine Reihe von Umgebungsvariablen festzulegen und die Eingabeaufforderung in den Namen der aktivierten virtuellen Umgebung zu ändern. Es fügt auch ein deaktivieren() Shell-Funktion, die alles zurücksetzt. Sobald eine virtuelle Umgebung aktiviert ist, tippen Sie ein Python wird seinen Python mit seinen Abhängigkeiten starten.

~> source ~ / venv_1 / bin / enable (venv_1) ~> welcher Python / Benutzer / Gigi / Venv_1 / bin / Python (venv_1) ~>

Lassen Sie uns deaktivieren:

(venv_1) ~> deaktivieren ~> welcher Python / usr / local / bin / python

Wenn auf Ihren Systemen mehrere Python-Interpreter installiert sind, können Sie mithilfe von die angeben, welche für Ihre virtuelle Umgebung verwendet werden soll -p Möglichkeit. Hier ist eine virtuelle Python 3-Umgebung:

~> virtualenv ~ / venv_3 -p / usr / local / bin / python3 Ausführen von virtualenv mit Interpreter / usr / local / bin / python3 Verwenden des Basispräfix '/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework /Versions/3.5 'Neue ausführbare Python-Datei in /Users/gigi/venv_3/bin/python3.5 Erstellen von ausführbaren Dateien auch in / Users / gigi / venv_3 / bin / python. Setuptools installieren, pip ... fertig. ~> source ~ / venv_3 / bin / enable (venv_3) ~> python Python 3.5.1 (Standardeinstellung: 9. Januar 2016, 19:28:52) [GCC 4.2.1-kompatibles Apple LLVM 7.0.0 (clang-700.1.76.) )] on darwin Geben Sie "help", "copyright", "credits" oder "license" ein, um weitere Informationen zu erhalten. >>>

Virtualenv funktioniert auch bei Pypy.

~> virtualenv ~ / venv_pypy -p 'which pypy' Ausführen von virtualenv mit Interpreter / usr / local / bin / pypy Neue ausführbare Pypy-Datei in / Users / gigi / venv_pypy / bin / pypy Setuptools installieren, pip ... fertig. ~> source ~ / venv_pypy / bin / enable (venv_pypy) ~> python Python 2.7.10 (5f8302b8bf9f53056e40426f10c72151564e5b19, 11. Februar 2016, 20:39:39) [PyPy 4.0.1 mit GCC 4.2.1 Compatible Apple LLVM 7.0.2 ( clang-700.1.81)] on darwin Geben Sie "help", "copyright", "credits" oder "license" ein, um weitere Informationen zu erhalten. >>>>

Sie können direkt von einer Umgebung zur anderen wechseln, ohne sie zuvor zu deaktivieren:

(venv_3) ~> source ~ / venv_2 / bin / enable (venv_2) ~> welcher Python / Benutzer / Gigi / Venv_2 / bin / Python

OK. Sehen wir uns an, wie zwei verschiedene Versionen desselben Pakets in zwei verschiedenen virtuellen Umgebungen verwendet werden. Dazu müssen Sie einfach jede Umgebung aktivieren und die gewünschte Version installieren. Die Umgebungen sind völlig unabhängig. Daher ist die Tatsache, dass es in einer anderen Umgebung eine andere Version gibt, kein Problem.

Lassen Sie uns das SH-Paket Version 1.0.0 auf "venv_1" installieren..

(venv_1) ~> pip install sh == 1.0 Sammeln von sh == 1.0.0 Herunterladen von sh-1.0.tar.gz Erstellen von Rädern für gesammelte Pakete: sh Ausführen von setup.py bdist_wheel für sh… done Gespeichert im Verzeichnis: / Users / gigi / Library / Caches / pip / wheels / f9 / fb / a1 / 383f6dc2834b319a788a006d3ab7cc014ee852485f00b9e8c3 Erfolgreich gebaut sh Installieren gesammelter Pakete: sh Erfolgreich installiertes sh-1.0 (venv_1) ~> pip freeze | grep sh sh == 1,0

Wechseln wir zu "venv_2" und installieren Sie Version 1.11.

(venv_1) ~> source ~ / venv_2 / bin / enable (venv_2) ~> pip install sh == 1.11 Sammeln von sh == 1.11 Herunterladen von sh-1.11.tar.gz Erstellen von Rädern für gesammelte Pakete: sh Ausführen von setup.py bdist_wheel für sh… done Im Verzeichnis gespeichert: / Users / gigi / Library / Caches / pip / wheels / ba / 4f / a5 / ec77d662c3bf38f564b5ab16f1f3dbb9575922826fe810961c Erfolgreich gebaut sh Installieren gesammelter Pakete: sh Erfolgreich installiert sh-1.11 (vv_2) ~> pip freeze | grep sh sh == 1.11

Wechseln wir nun wieder zu "venv_1" und stellen Sie sicher, dass die Version des SH-Pakets noch 1.0 ist.

(venv_2) ~> source ~ / venv_1 / bin / enable (venv_1) ~> pip freeze | grep sh sh == 1,0 (venv_1) ~>

Virtualenvwrapper

All das Aktivieren, Deaktivieren und Schalten kann nach einer Weile alt werden. Wenn Sie viele virtuelle Umgebungen verwalten, kann dies außer Kontrolle geraten. Hier setzt virtualenvwrapper an. Mit Virtualenvwrapper können Sie virtuelle Umgebungen auflisten, erstellen, löschen und kopieren. Außerdem können Sie die Umgebung problemlos wechseln. 

Hier sind alle Befehle:

~> virtualenvwrapper Bei virtualenvwrapper handelt es sich um eine Reihe von Erweiterungen für das virtualenv-Tool von Ian Bicking. Zu den Erweiterungen gehören Wrapper zum Erstellen und Löschen von virtuellen Umgebungen und zum anderweitigen Verwalten des Entwicklungsworkflows. Dadurch können Sie problemlos an mehreren Projekten gleichzeitig arbeiten, ohne Konflikte in deren Abhängigkeiten zu verursachen. Weitere Informationen finden Sie in der Dokumentation: http://virtualenvwrapper.readthedocs.org/de/latest/command_ref.html Verfügbare Befehle: add2virtualenv: Verzeichnis zum Importpfad hinzufügen allvirtualenv: Führen Sie einen Befehl in allen virtualenvs cdproject: Wechseln Sie in die aktiven Projekt-cdsitepackages: Wechseln Sie in das Site-Packages-Verzeichnis cdvirtualenv: Wechseln Sie in das Verzeichnis $ VIRTUAL_ENV. cpvirtualenv: Kopieren Sie die angegebene Virtualenv, um eine neue zu erstellen. lssitepackages: Listeninhalt des Site-Packages-Verzeichnisses lsvirtualenv: liste ein neues Projektverzeichnis und zugehöriges virtualenv mktmpenv: temporäres virtualenv mkvirtualenv erstellen: Neues Virtualenv in $ WORKON_HOME erstellen rmvirtualenv: Entfernen eines virtualenv setvirtualenvproject: Verknüpfen eines Projektverzeichnisses mit einem virtualenv showvirtualenv: Zeigen Sie die Details eines einzelnen Virtualenv-Touchscreen-Manager -packages on / off virtualenvwrapper: Diese Hilfemeldung anzeigen wipeenv: remove alle Pakete, die in der aktuellen virtualenv workon installiert sind: liste oder ändere funktionierende virtualenvs

Ich benutze so ziemlich zwei Befehle: mkvirtualenv und workon. Alle virtuellen Umgebungen werden unter erstellt ~ / .virtuelle Umgebungen.

So erstellen Sie eine neue virtuelle Umgebung:

~> mkvirtualenv venv Neue ausführbare Python-Datei in venv / bin / python2.7. Auch ausführbare Datei in venv / bin / python erstellen. Setuptools installieren, pip ... fertig. (venv) ~>

Dies ähnelt virtualenv, aber Sie geben kein Verzeichnis an, sondern nur einen Namen. Ihre neue Umgebung ist hier:

(venv) ~> tree -L 2 ~ / .virtualenvs / venv / /Users/gigi/.virtualenvs/venv/ ├── bin │ ├── aktivieren ├── │ aktivieren.csh │ ├── aktivieren.Fisch ├── th is _ │ │ ├── │ ├── 2 _ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Ea ea ea ea ea ea ├── ea ea ea ea ea ea ea ea ea ea ├── yth yth yth yth yth yth yth python2.7 ├── yth yth yth yth yth yth yth yth yth /usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/include/python2.7 └── lib └── python2.7

Um zwischen den Umgebungen zu wechseln, verwenden Sie die workon Befehl, der ohne Argumente nur alle virtuellen Umgebungen auflistet. Ich habe einige:

(venv) ~> workon acme_server conman curr-gen nupic übereroberer pandas prime_hunter pypy quote-service venv work (venv) ~> workon conman (conman) ~>

Virtualenv-Burrito

Virtualenv-Burrito ist ein Projekt zur Installation von virtualenv und virtualenvwrapper in einem Befehl.

Python 3 Venv

Das venv-Modul wurde zu Python 3.3 hinzugefügt und bietet, genau wie virtualenv, die integrierte Erstellung und Verwaltung virtueller Umgebungen. Der Befehl zum Erstellen von virtuellen Umgebungen lautet pyenv. Ansonsten ist es ziemlich ähnlich zu virtualenv.

Conda

Virtuelle Umgebungen sind sehr nützlich, um Abhängigkeiten zwischen verschiedenen Projekten zu isolieren. Dies gilt jedoch nicht für native Bibliotheken. Viele C-Erweiterungen hängen von bestimmten Versionen nativer Bibliotheken ab, und diese können nicht spezifisch für die virtuelle Umgebung sein. 

Conda kann dieses Problem angehen. Es ist ein Paketverwaltungssystem, das alle Abhängigkeiten behandelt, nicht nur Python-Abhängigkeiten. Es kann sogar zum Verpacken von Nicht-Python-Software verwendet werden.

Alternativen zu virtuellen Umgebungen

Müssen Sie virtuelle Umgebungen verwenden? Nicht wirklich. Wenn Sie aus irgendeinem Grund die Magie virtueller Umgebungen nicht mögen, gibt es andere Möglichkeiten.

Manuell Vendorize

Die Funktionalität einer virtuellen Umgebung ist ziemlich einfach. Wenn Sie vollständige Kontrolle benötigen, können Sie dies einfach selbst tun und genau die Teilmenge der gewünschten Tools und Pakete in eine Zielverzeichnisstruktur kopieren, einige Umgebungsvariablen einrichten und schon kann es losgehen.

VM oder Dockerized System Python

Wenn Sie Ihre Anwendungen in einem Docker-Container oder einem Cloud-Image backen, gibt es nur ein Projekt, und Sie benötigen möglicherweise keine virtuelle Umgebung in der Mitte. Sie können einfach auf dem System Python aufbauen und sicherstellen, dass es nicht geändert wird.

Tox

Wenn Sie nur Ihren Code unter verschiedenen Interpreten und Umgebungen testen möchten, kann Tox alles für Sie tun. Es werden weiterhin virtuelle Umgebungen unter den Deckblättern verwendet, aber Sie müssen sich nicht damit beschäftigen.

Best Practices

Für robuste Python-Systeme gibt es im Laufe der Zeit einige bewährte Vorgehensweisen für die Paketierung und virtuelle Umgebung.

Pin-Versionen in Ihren Anforderungsdateien

Pinning bedeutet, die Versionen Ihrer Abhängigkeiten genau anzugeben. Wenn eine neue Version herauskommt und Sie Ihre Anwendung auf einem neuen Server installieren, verwenden Sie immer noch die Version, die Sie getestet haben und die funktioniert, und nicht die neueste und beste Version. Hier gibt es einen Nachteil - Sie müssen die Versionen explizit aktualisieren, wenn Sie mit dem Fortschritt Ihrer Abhängigkeiten Schritt halten möchten -, aber es lohnt sich in der Regel.

Verwenden Sie niemals den System-Python

Sich auf die Systemversion zu verlassen, ist eine schlechte Praxis, da es andere Tools gibt, die sich darauf verlassen, und wenn Sie mit dem Upgrade von Systempaketen beginnen, können Sie diese beschädigen. Sie können auch von Sicherheitsupdates betroffen sein, die Systempakete modifizieren. Wenn Sie ein Upgrade Ihres Betriebssystems durchführen möchten, stellen Sie im Allgemeinen fest, dass das System Python jetzt anders ist.

Verwenden Sie einen privaten Paketindex, wenn Sie Bilder backen

PyPI ist möglicherweise ausgefallen. Wenn Sie ein neues Image backen müssen und nicht auf PyPI zugreifen können, haben Sie Probleme. Devpi ist eine gute Option, um Frustration zu vermeiden.

Fazit

Es gibt viele Optionen, um mehrere Python-Projekte auf demselben Computer ohne Konflikte zu verwalten. Finden Sie heraus, welche Option für Sie am besten geeignet ist, und verwenden Sie sie. Das Erstellen virtueller Umgebungen ist schnell und einfach. Zögern Sie nicht, dieses nützliche Tool zu nutzen. Wenn Sie spezielle Anforderungen haben, gibt es auch viele Lösungen.