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

1022

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

Flimm
quelle
20
Um die engen Abstimmungen zu verhindern, hielt ich dies für eine allgemeinere Frage als stackoverflow.com/questions/29950300/… , und daher fühlte ich mich nicht wohl, diese Frage zu bearbeiten oder eine übermäßig allgemeine Antwort auf diesen Beitrag zu veröffentlichen.
Flimm
12
Diese Anleitung ist sowohl nützlich als auch ständig aktualisiert, da Python immer mehr "eine und nur eine offensichtliche Möglichkeit" hinzufügt, Dinge zu tun: docs.python-guide.org/en/latest/dev/virtualenvs
michael
2
Ab 3.6 fand ich es einfacher, virtualenv im Vergleich zu pyenv unter macOS zum Laufen zu bringen (ich bin ein pyNoob)
HashRocketSyntax
@HashRocketSyntax virtualenvund pyenvführen nicht die gleiche Funktion aus und sind keine Alternativen zueinander. Siehe meine Antwort.
Flimm
6
Ich habe einen ganzen Tag verbrannt und Zeit mit Pipenv verschwendet. Unterm Strich ist es übermarktet. Venv und virtualenv, wenn Sie py2 benötigen, sind die richtigen Werkzeuge. Conda (Miniconda, wenn Sie nicht den vollen Stapel benötigen) ist auch sehr gut. Sehr gute Zusammenfassung: chriswarrick.com/blog/2018/07/17/…
SwimBikeRun

Antworten:

1382

PyPI-Pakete nicht in der Standardbibliothek:

  • virtualenvist ein sehr beliebtes Tool, das isolierte Python-Umgebungen für Python-Bibliotheken erstellt. Wenn Sie mit diesem Tool nicht vertraut sind, empfehle ich dringend, es zu lernen, da es ein sehr nützliches Tool ist, und ich werde für den Rest dieser Antwort Vergleiche damit anstellen.

    Es funktioniert, indem eine Reihe von Dateien in einem Verzeichnis installiert werden (z. B. env/:) und anschließend die PATHUmgebungsvariable so geändert wird, dass ihr ein benutzerdefiniertes binVerzeichnis vorangestellt wird (z env/bin/. B. :) . Eine genaue Kopie der pythonoder python3binär wird in diesem Verzeichnis abgelegt, aber Python ist so programmiert, dass es zuerst im Umgebungsverzeichnis nach Bibliotheken relativ zu seinem Pfad sucht. Es ist nicht Teil der Standardbibliothek von Python, wird jedoch offiziell von der PyPA (Python Packaging Authority) gesegnet. Nach der Aktivierung können Sie Pakete in der virtuellen Umgebung mit installieren pip.

  • pyenvwird verwendet, um Python-Versionen zu isolieren. Beispielsweise möchten Sie Ihren Code möglicherweise gegen Python 2.7, 3.6, 3.7 und 3.8 testen, sodass Sie eine Möglichkeit benötigen, zwischen diesen zu wechseln. Nach der Aktivierung wird der PATHUmgebungsvariablen ein Präfix vorangestellt ~/.pyenv/shims, in dem spezielle Dateien vorhanden sind, die den Python-Befehlen ( python, pip) entsprechen. Dies sind keine Kopien der von Python gelieferten Befehle. Hierbei handelt es sich um spezielle Skripts, die im Handumdrehen anhand der PYENV_VERSIONUmgebungsvariablen, der .python-versionDatei oder der ~/.pyenv/versionDatei entscheiden, welche Version von Python ausgeführt werden soll. pyenvAußerdem wird das Herunterladen und Installieren mehrerer Python-Versionen mithilfe des Befehls vereinfacht pyenv install.

  • pyenv-virtualenvist ein Plugin für pyenvvom selben Autor wie pyenvzu ermöglichen , die Sie zu verwenden pyenvund virtualenvbequem gleichzeitig an. Wenn Sie jedoch Python 3.3 oder höher verwenden, pyenv-virtualenvwird versucht, es auszuführen, python -m venvwenn es verfügbar ist, anstatt virtualenv. Sie können virtualenvund pyenvzusammen ohne verwenden pyenv-virtualenv, wenn Sie die Komfortfunktionen nicht möchten.

  • virtualenvwrapperist eine Reihe von Erweiterungen für virtualenv(siehe Dokumente ). Es gibt Ihnen Befehle wie mkvirtualenv, lssitepackagesund insbesondere workonzum Wechseln zwischen verschiedenen virtualenvVerzeichnissen. Dieses Tool ist besonders nützlich, wenn Sie mehrere virtualenvVerzeichnisse möchten .

  • pyenv-virtualenvwrapperist ein Plugin für pyenvvom selben Autor wie pyenv, um bequem zu integrieren virtualenvwrapperin pyenv.

  • pipenvzielt darauf ab Pipfile, pipund virtualenvin einem Befehl in der Befehlszeile zu kombinieren . Das virtualenvVerzeichnis wird normalerweise abgelegt ~/.local/share/virtualenvs/XXX, wobei XXXes sich um einen Hash des Pfads des Projektverzeichnisses handelt. Dies unterscheidet sich von virtualenvdem Verzeichnis, in dem sich das Verzeichnis normalerweise im aktuellen Arbeitsverzeichnis befindet. pipenvist für die Entwicklung von Python-Anwendungen vorgesehen (im Gegensatz zu Bibliotheken). Es gibt Alternativen zu pipenvsolchen poetry, die ich hier nicht auflisten werde, da es sich bei dieser Frage nur um Pakete handelt, die ähnlich benannt sind.

Standardbibliothek:

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

  • venvist ein mit Python 3 python3 -m venvgeliefertes Paket, das Sie verwenden können (obwohl einige Distributionen es aus irgendeinem Grund in ein separates Distributionspaket aufteilen, z. B. python3-venvunter Ubuntu / Debian). Es dient demselben Zweck wie virtualenv, verfügt jedoch nur über eine Teilmenge seiner Funktionen ( siehe Vergleich hier ). virtualenvist weiterhin beliebter als venv, zumal erstere sowohl Python 2 als auch Python 3 unterstützen.

Empfehlung für Anfänger:

Dies ist meine persönliche Empfehlung für Anfänger: Start von Lernen virtualenvund pipWerkzeugen sowohl mit Python der Arbeit 2 und 3 und in einer Vielzahl von Situationen und andere Werkzeuge abholen , sobald Sie sie starten zu müssen.

Flimm
quelle
115
Das ist sehr hilfreich! Warum gibt es also 8 verwickelte Dinge anstelle von 1? ("Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun." - Das Zen von Python)
Jerry101
59
@ Jerry101, die Einführung von venv ist teilweise eine Antwort auf dieses Durcheinander. Wenn Sie zur Verbesserung der Situation beitragen möchten, empfehle ich Ihnen, venv zu verwenden und andere zu ermutigen, dasselbe zu tun.
Magnus Lind Oxlund
31
"Die Einführung von venv ist zum Teil eine Reaktion auf dieses Durcheinander." Wie kommt es, dass die Leute, wenn es zu viele Dinge gibt, die "so etwas wie X" tun, immer denken, dass sie dieses Durcheinander verbessern können, indem sie eine andere Sache machen, die "so etwas wie X" tut? . Eigentlich ist es irgendwie lustig. Wir sind jetzt 4 Jahre später ... also ist es vielleicht angebracht zu fragen, venvob das Problem tatsächlich gelöst wurde.
Kris
34
Die einzigen zwei Tools auf der Liste, die wirklich das wohl gleiche Gebiet abdecken, sind virtualenv und venv. Daher ist die Charakterisierung, dass es sich um ein Durcheinander handelt, das durch mehrere konkurrierende Tools verursacht wird, nicht sehr genau. Die Liste besteht jedoch aus mehreren Tools für die virtuelle Umgebung, die alle ähnlich klingende Namen haben. Das kann verwirrend sein, insbesondere für Benutzer, die gerade etwas über sie lernen. Hat venv die Situation verbessert? Es bot eine leichtere Alternative zu anderen Tools für virtuelle Umgebungen und profitierte von nativen Änderungen und einem Platz in der Standardbibliothek. …
Magnus Lind Oxlund
11
@cowbert Nachdem Sie gerade ein Upgrade von Python 3.5 auf Python 3.6 durchgeführt haben und alle meine virtuellen Anwendungen unterbrochen wurden, können Sie anscheinend venveinfacher auf eine neue Python-Version aktualisieren.
Daniel H
276

Ich würde nur die Verwendung von virtualenvnach Python3.3 + vermeiden und stattdessen die standardmäßige ausgelieferte Bibliothek verwenden venv. Um eine neue virtuelle Umgebung zu erstellen, geben Sie Folgendes ein:

$ python3 -m venv <MYVENV>  

virtualenvversucht, die Python-Binärdatei in das bin-Verzeichnis der virtuellen Umgebung zu kopieren. In diese Binärdatei eingebettete Bibliotheksdateiverknüpfungen werden jedoch nicht aktualisiert. Wenn Sie also Python aus dem Quellcode in ein Nicht-Systemverzeichnis mit relativen Pfadnamen erstellen, wird die Python-Binärdatei unterbrochen. Da Sie auf diese Weise eine kopierbare, verteilbare Python erstellen, ist dies ein großer Fehler. Übrigens, um eingebettete Bibliotheksdateilinks unter OS X zu überprüfen otool. 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 virtualenvwrapperund vermeiden pipenv. pyvenvist veraltet. pyenvscheint oft dort virtualenvverwendet zu werden, wo es verwendet wird, aber ich würde mich auch davon fernhalten, da ich denke, dass es venvauch das tut, wofür pyenves gebaut wurde.

venvErstellt virtuelle Umgebungen in der Shell, die frisch und mit Sandboxen versehen sind , mit vom Benutzer installierbaren Bibliotheken und ist für mehrere Pythons sicher . Neu, da virtuelle Umgebungen nur mit den Standardbibliotheken beginnen, die im Lieferumfang von Python enthalten sind, müssen Sie alle anderen Bibliotheken erneut installieren, pip installwährend die virtuelle Umgebung aktiv ist. Sandboxed, da keine dieser neuen Bibliotheksinstallationen außerhalb der virtuellen Umgebung sichtbar ist. Sie können also die gesamte Umgebung löschen und erneut starten, ohne sich Gedanken über die Auswirkungen auf Ihre Basis-Python-Installation machen zu müssen. Vom Benutzer installierbare Bibliotheken, da der Zielordner der virtuellen Umgebung ohne erstellt wirdsudoIn einem Verzeichnis, das Sie bereits besitzen, benötigen Sie keine sudoBerechtigungen, um Bibliotheken darin zu installieren. Schließlich ist es Multi-Python-sicher , da bei der Aktivierung virtueller Umgebungen in der Shell nur die Python-Version (3.4, 3.5 usw.) angezeigt wird, die zum Erstellen dieser virtuellen Umgebung verwendet wurde.

pyenvähnelt darin, venvdass Sie damit mehrere Python-Umgebungen verwalten können. Jedoch mit pyenvSie können nicht bequem Rollback - Bibliothek installiert zu einem gewissen Startzustand und Sie werden wahrscheinlich brauchen adminPrivilegien zu einem bestimmten Zeitpunkt zu aktualisieren Bibliotheken. Daher denke ich, dass es auch am besten ist, es zu verwenden venv.

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

Riaz Rizvi
quelle
3
add2virtualenvOptimiert Ihre PYTHONPATHdurch Hinzufügen einer benutzerdefinierten _virtualenv_path_extensions.pthDatei unter site-packages. Alternativ können Sie die PYTHONPATHUmgebungsvariable in der bin/activateDatei aktualisieren, die Sie bei jeder Aktivierung der virtuellen Umgebung aufrufen. Oder Sie können Symlinks unter hinzufügen site-packages, um auf die zusätzlichen Verzeichnisse zu verweisen. Beide Alternativen sind transparenter für die herkömmlichen Befehlszeilentools, die Entwickler häufig zur Fehlerbehebung verwenden. Die Verwendung eines Brauchs .pthmit einem undokumentierten Namen lässt es magischer erscheinen, IMO.
Riaz Rizvi
15
Okay, ich habe auf stackoverflow.com/questions/48130371/… bestätigt, dass ein korrektes Update PYTHONPATHdie Notwendigkeit überflüssig macht add2virtualenv. In Bezug auf den Mangel an Hilfe zu SO aus Ihrem ersten Kommentar ist mein einziger Vorschlag, Antworten zu verbessern, wenn sie Ihr Problem beheben, um die Leute zu motivieren, beim Posten für Sie Fehler zu beheben? Eine halbe Stunde Nachforschungen + Zuschreibung im Austausch für einen Mausklick? Klingt nach einem guten Handel ...
Riaz Rizvi
7
Nein, Sie haben Recht - ich versuche, gut zu stimmen. Wenn du in meiner Nähe wärst, würde ich dir ein Bier kaufen. Ich werde mein Versprechen einhalten und sehen, ob die Python-Doc-Leute mir erlauben, die Änderung aus Gründen der Klarheit zu / bin / die offiziellen Docs hinzuzufügen. Obwohl ich nicht großartig bin, bin ich nicht schrecklich in Python. Wenn es mir schwer gefallen ist ... Wie auch immer, danke für deine Zeit - wünsche dir alles Gute.
SteveJ
9
@ MalikA.Rumi Der Segen wurde leicht reduziert auf "den Pipenv-Schöpfer, der fleißig an uns und andere vermarktet wird, weshalb wir Pipenv erwähnen".
Rob Grant
6
@AndreaMoro Es ist das pyvenv, was veraltet ist, nicht pyenv. Es ist so leicht, mit den Namen dieser Tools verwechselt zu werden.
Daniel Holmes
24

Ich bin in das pipenvKaninchenloch gegangen ( es ist in der Tat ein tiefes und dunkles Loch ... ) und da die letzte Antwort vor über 2 Jahren war , hielt ich es für nützlich, die Diskussion mit den neuesten Entwicklungen zum Thema Python Virtual Envelopes I zu aktualisieren habe gefunden.

HAFTUNGSAUSSCHLUSS:

Bei dieser Antwort geht es NICHT darum, die heftige Debatte über die Vorzüge von pipenv versus venv als Umschlaglösungen fortzusetzen - ich unterstütze dies auch nicht . Es geht darum, dass PyPA widersprüchliche Standards befürwortet und wie die zukünftige Entwicklung von virtualenv verspricht, eine Entweder-Oder- Wahl überhaupt zu negieren . Ich habe mich genau deshalb auf diese beiden Werkzeuge konzentriert, weil sie von PyPA gesalbt wurden .

venv

Wie das OP feststellt, ist venv ein Tool zur Virtualisierung von Umgebungen. KEINE Lösung von Drittanbietern, sondern ein natives Tool. PyPA unterstützt venv für die Erstellung von VIRTUAL ENVELOPES : " In Version 3.5 geändert: Die Verwendung von venv wird jetzt für die Erstellung virtueller Umgebungen empfohlen ."

pipenv

pipenv kann - wie venv - zum Erstellen virtueller Umschläge verwendet werden, bietet jedoch zusätzlichFunktionenfür die Paketverwaltung und die Überprüfung von Sicherheitslücken . Anstelle der Verwendungrequirements.txt,pipenvliefertPaketmanagement via Pipfile . Da PyPA pipenv für PACKAGE MANAGEMENT befürwortet , scheint dies zu implizieren, dass espipfileersetzt wirdrequirements.txt.

JEDOCH : pipenv verwendet virtualenv als Werkzeug zum Erstellen virtueller Umschläge, NICHT venv, das von PyPA als Go-to-Tool zum Erstellen virtueller Umschläge empfohlen wird .

Widersprüchliche Standards:

Wenn es also nicht schwierig genug war, sich für eine Lösung für virtuelle Umschläge zu entscheiden, unterstützt PyPA jetzt zwei verschiedene Tools, die unterschiedliche Lösungen für virtuelle Umschläge verwenden. Die tobende Github-Debatte über venv vs virtualenv, die diesen Konflikt hervorhebt, finden Sie hier .

Konfliktlösung:

Die Github-Debatte, auf die im obigen Link verwiesen wird, hat die Entwicklung von virtualenv in Richtung der Anpassung von venv in zukünftigen Versionen gelenkt :

lieber eingebautes venv: Wenn die Zielpython venv hat, erstellen wir die Umgebung damit (und führen dann nachfolgende Operationen durch, um andere von uns angebotene Garantien zu vereinfachen).

Fazit:

Es sieht also so aus, als ob es in Zukunft eine gewisse Konvergenz zwischen den beiden konkurrierenden Lösungen für virtuelle Hüllkurven geben wird, aber ab sofort unterscheidet sich pipenv - das verwendet virtualenv- erheblich von venv.

Angesichts der Probleme, die pipenv löst, und der Tatsache, dass PyPA seinen Segen gegeben hat, scheint es eine glänzende Zukunft zu haben. Und wenn virtualenv auf seine vorgeschlagenen Entwicklungsziele liefert, sollte nicht mehr eine virtuelle Hülle Lösung der Wahl sein , ein Fall von beiden pipenv OR Venv .

F1Linux
quelle
6
Soweit ich verstanden habe: Der tatsächliche Wert von pipenv wurde bereits seit einiger Zeit diskutiert und seit über einem Jahr nicht mehr veröffentlicht. Viele Dinge haben sich seitdem geändert, und ich würde argumentieren, dass es für pipenv nur noch schlimmer wurde (Werkzeuge wie Poesie und Pip-Werkzeuge sind in einem viel besseren Zustand). Die PyPA- Seiten sind veraltet, und ich würde argumentieren, dass sie pipenv herabstufen sollten . venv ist ein Standardwerkzeug und als solches sehr effizient, verfügt jedoch nur über begrenzte Funktionen. virtualenv konkurriert nicht mit venv, sondern versucht, die Bereiche abzudecken, in die venv nicht gehen kann oder will (da es ein Standard ist).
Sinoroc
@sinoroc Mein Beitrag war nicht über die Vorzüge oder pipenv., Es ging um die widersprüchlichen Führung von PyPA sowohl pipenv befürwortende UND Venv machen die Wahl eines Umschlags Lösung schwieriger und wie es ein gewisses Maß an Converge erscheint die Notwendigkeit negieren zu wählen zwischen ihnen überhaupt. Beachten Sie, dass ich nichts unterstütze, sondern nur teile, was ich über die Entwicklung dieser beiden von PyPA empfohlenen Lösungen gelernt habe . PyPA Interesse an ihnen gegeben, ob ich mag sie oder nicht irrelevant: pipenv und Venv schien wahrscheinlich ein Teil der Landschaft geworden
F1Linux
9
Ich würde sagen, bleib so oft wie möglich bei venv und pip . Diese beiden sind hier, um zu bleiben. Venv ist Teil der Standardbibliothek von Python und in gewisser Weise auch pip, da es in Python (über surepip ) verkauft wird. Die anderen Tools ( abgesehen von der Pyenv- Serie: etwas ganz anderes) scheinen sich entweder auf venv und pip zu stützen oder (mit mehr oder weniger Erfolg) zu emulieren . Was toll ist. Aber wenn die Dinge schlecht laufen , sind Venv und Pip der sichere Fallback. Das einzige andere Werkzeug, das ich benutze, ist tox (mit tox-venv), um die virtuellen Umgebungen zu erstellen und zu füllen (unkompliziert, keine Magie, seltsam, es wird noch nicht erwähnt).
Sinoroc
3
Dieser neueste Beitrag ist Gold wert, da er beim Ausbügeln der Falten großartige Arbeit geleistet hat. Ich halte mich an pip und venv, da ich Probleme mit baumelnden Binärdateien mit virtualenv hatte, als Systempython aktualisiert wurde.
Codeviper
1
In der Vergangenheit bin ich auf Probleme mit pipenv nonverbose bei Fehlern gestoßen. Argl und Graben. Außerdem: chriswarrick.com/blog/2018/07/17/…
qrtLs
3

Update April 2020

Ich habe danach gesucht, als ich auf diesen Beitrag gestoßen bin . Ich denke, diese Frage, welches Tool verwendet werden soll, ist für neue Python-Benutzer wie mich ziemlich verwirrend und schwierig. Dies ist direkt von der PyPA-Website in Bezug auf pipenv:

Während dieses Tutorial das pipenv-Projekt als Tool behandelt, das sich hauptsächlich auf die Anforderungen der Python-Anwendungsentwicklung und nicht auf die Entwicklung der Python-Bibliothek konzentriert, arbeitet das Projekt selbst derzeit an mehreren Prozess- und Wartungsproblemen, die verhindern, dass Fehlerkorrekturen und neue Funktionen veröffentlicht werden ( mit dem gesamten Jahr 2019 ohne Neuerscheinung). Dies bedeutet, dass pipenv kurzfristig immer noch unter mehreren Macken und Leistungsproblemen leidet, ohne dass ein klarer Zeitplan für die Lösung dieser Probleme vorliegt.

Während dies weiterhin der Fall ist, möchten Projektbetreuer wahrscheinlich andere Tools für das Anwendungsabhängigkeitsmanagement zur Verwendung anstelle von oder zusammen mit pipenv untersuchen.

Unter der Annahme, dass die Veröffentlichung von pipenv im April 2020 wie geplant durchgeführt wird und die Veröffentlichung danach ebenfalls auf Kurs bleibt, wird diese Einschränkung im Tutorial entfernt. Wenn diese Releases nicht auf dem richtigen Weg bleiben, wird das Lernprogramm selbst entfernt und durch eine Diskussionsseite zu den verfügbaren Optionen für das Abhängigkeitsmanagement ersetzt.

Arnuld
quelle
Es sieht so aus, als ob sich pipenv derzeit (dh im Mai 2020) noch in der Vorabversion für die Veröffentlichung im April 2020 befindet. Siehe hier .
Andrewjames
Dies beantwortet die Frage nicht.
Flimm
Ich denke, @Flimm hat die Fragen gut beantwortet. Ich antwortete auf die Antwort von
F1Linux
1
Ab 4. Juni 2020, das pipenvhat Team 2 Versionen PyPI Freigabe: 2020.5.28und in jüngerer Zeit 2020.6.2: pypi.org/project/pipenv/#history
Nichtsein