webentwicklung-frage-antwort-db.com.de

Was ist der Unterschied zwischen venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv usw.?

Python 3.3 enthält in seiner Standardbibliothek das neue Paket venv. Was macht es und wie unterscheidet es sich von all den anderen Paketen, die dem regulären Ausdruck (py)?(v|virtual|pip)?env zu entsprechen scheinen?

715
Flimm

PyPI-Pakete, die nicht in der Standardbibliothek enthalten sind:

  • virtualenv ist ein sehr beliebtes Tool, das isolierte Python Umgebungen erstellt für Python Bibliotheken. Wenn Sie mit diesem Tool nicht vertraut sind, empfehle ich Ihnen, es zu erlernen, da es ein sehr nützliches Tool ist. Im weiteren Verlauf dieser Antwort werde ich Vergleiche anstellen.

    Es funktioniert, indem eine Reihe von Dateien in einem Verzeichnis installiert werden (zB: env/) und dann die Umgebungsvariable PATH dahingehend geändert wird, dass ein benutzerdefiniertes bin -Verzeichnis vorangestellt wird (zB: env/bin/). Eine genaue Kopie der Binärdatei python oder python3 wird in diesem Verzeichnis abgelegt, aber Python ist so programmiert, dass in der Umgebung zuerst nach Bibliotheken in Bezug auf ihren Pfad gesucht wird Verzeichnis. Es ist nicht Teil der Standardbibliothek von Python, wird aber offiziell von der PyPA (Python Packaging Authority) gesegnet. Einmal aktiviert, können Sie Pakete in der virtuellen Umgebung mit pip installieren.

  • pyenv wird verwendet, um Python Versionen zu isolieren. Beispielsweise möchten Sie Ihren Code möglicherweise mit Python 2.6, 2.7, 3.3, 3.4 und 3.5 testen, damit Sie zwischen ihnen wechseln können. Nach der Aktivierung wird der Umgebungsvariablen PATH das Präfix ~/.pyenv/shims vorangestellt, in dem sich spezielle Dateien befinden, die mit den Befehlen Python (python, pip). Dies sind keine Kopien der von Python gelieferten Befehle. Es handelt sich um spezielle Skripte, die im Handumdrehen entscheiden, welche Version von Python basierend auf der Umgebungsvariablen PYENV_VERSION oder der .python-version -Datei oder der ~/.pyenv/version Datei. pyenv vereinfacht auch das Herunterladen und Installieren mehrerer Python Versionen mit dem Befehl pyenv install.

  • pyenv-virtualenv ist ein Plugin für pyenv vom selben Autor wie pyenv, damit Sie pyenv und virtualenv bequem gleichzeitig verwenden können. Wenn Sie jedoch Python 3.3 oder höher verwenden, versucht pyenv-virtualenv, python -m venv auszuführen, falls verfügbar, anstelle von virtualenv . Sie können virtualenv und pyenv zusammen ohne pyenv-virtualenv verwenden, wenn Sie die praktischen Funktionen nicht nutzen möchten.

  • virtualenvwrapper ist eine Reihe von Erweiterungen für virtualenv (siehe = docs ). Sie erhalten Befehle wie mkvirtualenv, lssitepackages und insbesondere workon zum Umschalten zwischen verschiedenen virtualenv Verzeichnissen. Dieses Tool ist besonders nützlich, wenn Sie mehrere virtualenv Verzeichnisse benötigen.

  • pyenv-virtualenvwrapper ist ein Plugin für pyenv vom selben Autor wie pyenv, um virtualenvwrapper bequem in pyenv zu integrieren.

  • pipenv, von Kenneth Reitz (der Autor von requests) , ist das neueste Projekt in dieser Liste. Ziel ist es, Pipfile, pip und virtualenv in einem Befehl in der Befehlszeile zu kombinieren. Das Verzeichnis virtualenv wird normalerweise in ~/.local/share/virtualenvs/XXX abgelegt, wobei XXX ein Hash des Pfads des Projektverzeichnisses ist. Dies unterscheidet sich von virtualenv, bei dem sich das Verzeichnis normalerweise im aktuellen Arbeitsverzeichnis befindet.

    Das Python Paketierungshandbuch empfiehlt pipenv beim Entwickeln von Python Anwendungen (im Gegensatz zu Bibliotheken). Es scheint keine Pläne zu geben, venv anstelle von virtualenv zu unterstützen ( # 15 ). Verwirrenderweise bezieht sich die Befehlszeilenoption --venv auf das Verzeichnis virtualenv, nicht auf venv, und in ähnlicher Weise wirkt sich die Umgebungsvariable PIPENV_VENV_IN_PROJECT auf aus Speicherort des Verzeichnisses virtualenv, nicht des Verzeichnisses venv ( # 1919 ).

Standardbibliothek:

  • pyvenv ist ein Skript, das mit Python 3 ausgeliefert wird, aber veraltet in Python 3.6 da es Probleme gab (ganz zu schweigen vom verwirrenden Namen). In Python 3.6+ ist das genaue Äquivalent python3 -m venv.

  • venv ist ein Paket, das mit Python 3 ausgeliefert wird kann mit python3 -m venv ausgeführt werden (obwohl einige Distributionen es aus irgendeinem Grund in ein separates Distributionspaket aufteilen, wie python3-venv unter Ubuntu/Debian). Es hat einen ähnlichen Zweck wie virtualenv und funktioniert auf sehr ähnliche Weise, muss jedoch nicht Python Binärdateien kopieren (außer unter Windows). Verwenden Sie diese Option, wenn Sie nicht Python 2 unterstützen müssen. Zum Zeitpunkt des Schreibens scheint die Community Python mit virtualenv und I haven 'zufrieden zu sein. Ich habe nicht viel von venv gehört.

Die meisten dieser Tools ergänzen sich gegenseitig. Beispielsweise integriert pipenvpip, virtualenv und auf Wunsch sogar pyenv. Die einzigen Werkzeuge, die echte Alternativen zueinander sind, sind venv und virtualenv.

Empfehlung für Anfänger:

Dies ist meine persönliche Empfehlung für Anfänger: Beginnen Sie mit dem Erlernen von virtualenv und pip, Tools, die mit Python 2 und 3 und in verschiedenen Situationen funktionieren, und Nehmen Sie die anderen Werkzeuge mit, sobald Sie sie benötigen.

1047
Flimm

Ich würde einfach die Verwendung von virtualenv nach Python3.3 + vermeiden und stattdessen die mitgelieferte Standardbibliothek venv verwenden. Um eine neue virtuelle Umgebung zu erstellen, geben Sie Folgendes ein:

$ python3 -m venv <MYVENV>  

virtualenv versucht, die Binärdatei Python in das bin-Verzeichnis der virtuellen Umgebung zu kopieren. Die in diese Binärdatei eingebetteten Bibliotheksdateilinks werden jedoch nicht aktualisiert. Wenn Sie also Python aus der Quelle in ein Nicht-Systemverzeichnis mit relativen Pfadnamen erstellen, wird die Binärdatei Python unterbrochen. Da Sie auf diese Weise eine verteilbare Kopie von Python erstellen, ist dies ein großer Fehler. Verwenden Sie otool, um Verknüpfungen eingebetteter Bibliotheksdateien unter OS X zu überprüfen. Geben Sie beispielsweise in Ihrer virtuellen Umgebung Folgendes ein:

$ otool -L bin/python
python:
    @executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

Folglich würde ich virtualenvwrapper und pipenv vermeiden. pyvenv ist veraltet. pyenv wird anscheinend häufig dort verwendet, wo virtualenv verwendet wird, aber ich würde mich auch davon fernhalten, da ich denke, dass venv auch das tut, wofür pyenv gebaut wurde.

venv erstellt virtuelle Umgebungen in der Shell, die fresh und sandboxed sind, mit benutzerinstallierbaren Bibliotheken und es ist Multi-Python-Safe. Fresh Da virtuelle Umgebungen nur mit den mit Python gelieferten Standardbibliotheken beginnen, müssen Sie alle anderen Bibliotheken mit pip install erneut installieren, während die virtuelle Umgebung aktiv ist. Sandboxed Da keine dieser neuen Bibliotheksinstallationen außerhalb der virtuellen Umgebung sichtbar ist, können Sie die gesamte Umgebung löschen und erneut starten, ohne sich um die Auswirkungen auf die python -Installation kümmern zu müssen. Vom Benutzer installierbare Bibliotheken da der Zielordner der virtuellen Umgebung ohne Sudo in einem Verzeichnis erstellt wird, das Sie bereits besitzen, benötigen Sie keine Sudo Berechtigungen, um Bibliotheken darin zu installieren. Schließlich ist es Multi-Python-Safe, da die Shell beim Aktivieren virtueller Umgebungen nur die python -Version (3.4, 3.5 usw.) sieht, die zum Erstellen dieser virtuellen Umgebung verwendet wurde.

pyenv ähnelt venv darin, dass Sie mehrere python Umgebungen verwalten können. Mit pyenv können Sie Bibliotheksinstallationen jedoch nicht bequem auf einen bestimmten Startstatus zurücksetzen, und Sie benötigen wahrscheinlich irgendwann admin Berechtigungen, um Bibliotheken zu aktualisieren. Ich denke, es ist auch am besten, venv zu verwenden.

In den letzten Jahren habe ich viele Probleme mit Build-Systemen (emacs-Pakete, python eigenständige Anwendungsbuilder, Installer ...) festgestellt, die letztendlich auf Probleme mit virtualenv zurückzuführen sind. Ich denke, python wird eine bessere Plattform sein, wenn wir diese zusätzliche Option eliminieren und nur venv verwenden.

182
Riaz Rizvi