So verwalten Sie mehrere Python-Versionen und virtuelle Umgebungen

Ergänzung Januar 2019: Wenn Sie nach dem Upgrade auf macOS Mojave zu diesem Blog zurückkehren, finden Sie in diesem Github-Problem eine Lösung für das häufig auftretende Problem "Zlib nicht verfügbar".

Bevor wir beginnen, gehen wir kurz auf die im Titel verwendeten Begriffe ein:

  • Mehrere Python-Versionen : Verschiedene Installationen von Python auf demselben Computer, z. B. 2.7 und 3.4.
  • Virtuelle Umgebungen : Isolierte unabhängige Umgebungen, in denen sowohl eine bestimmte Version von Python als auch projektspezifische Pakete installiert sein können, ohne dass dies Auswirkungen auf andere Projekte hat.

Hier sehen wir uns drei verschiedene Tools an, mit denen Sie arbeiten können und wann Sie jedes benötigen. Lassen Sie uns die Anwendungsfälle untersuchen für:

  • venv /. pyvenv
  • pyenv
  • pyenv-virtualenv

Wenn Sie eine verwenden Single - Version von Python sagen Version 3.3+ und verwalten möchten verschiedene virtuelle Umgebungen, dann venvist alles , was Sie brauchen.

Wenn Sie mehrere Versionen von Python ab Version 3.3 mit oder ohne virtuelle Umgebungen verwenden möchten , lesen Sie weiter pyenv.

Wenn Sie auch mit arbeiten möchten Python 2 , dann pyenv-virtualenvist ein Werkzeug zu betrachten.

venv

Ab Python 3.3+ ist das venvPaket enthalten. Es ist ideal zum Erstellen leichter virtueller Umgebungen.

Bis zu Python 3.6 war ein aufgerufenes Skript pyvenvebenfalls als Wrapper enthalten venv, was jedoch veraltet war. Es wird in Python 3.8 vollständig entfernt. Bei der Verwendung steht genau dieselbe Funktionalität zur Verfügung venv, und alle vorhandenen Dokumentationen sollten aktualisiert werden. Für alle Interessierten können Sie die Gründe für die Abschreibung lesen pyvenv.

venv wird verwendet, um eine neue Umgebung über den Terminalbefehl zu erstellen:

$ python3 -m venv directory-name-to-create

aktiviert mit:

$ source name-given/bin/activate

und deaktiviert mit einfach:

$ deactivate

Wenn Sie die Umgebung nach dem Deaktivieren vollständig entfernen müssen, können Sie Folgendes ausführen:

$ rm -r name-given

Standardmäßig ist die Umgebung, die erstellt wird, die aktuelle Version von Python, die Sie verwenden. Wenn Sie Dokumentation schreiben und die zusätzliche Sicherheit wünschen, dass die richtige Version von Python von Ihrem Leser verwendet wird, können Sie die Haupt- und Nebenversionsnummer im Befehl wie folgt angeben:

$ python3.6 -m venv example-three-six

Wenn der Reader eine andere Version als 3.6 verwendet, ist der Befehl nicht erfolgreich und wird in seiner Fehlermeldung angezeigt. Es funktioniert jedoch jede Patch-Version (z. B. 3.6.4).

Wenn die Umgebung aktiv ist, können alle Pakete wie gewohnt über sie installiert werden pip. Standardmäßig wird die neu geschaffene Umgebung wird nicht enthalten alle Pakete bereits auf dem Rechner installiert. Da pipselbst wird nicht unbedingt auf der Maschine installiert. Es wird empfohlen, zuerst mit pipauf die neueste Version zu aktualisieren pip install --upgrade pip.

Projekte haben normalerweise eine requirements.txtDatei, in der die Abhängigkeiten angegeben sind. Auf diese Weise kann der Befehl shortcut command pip install -r requirements.txtalle Pakete schnell in der neu erstellten virtuellen Umgebung installieren. Sie sind nur in der virtuellen Umgebung vorhanden. Es ist nicht verfügbar, wenn es deaktiviert ist, bleibt jedoch bestehen, wenn es reaktiviert wird.

Wenn Sie keine zusätzlichen Versionen von Python selbst verwenden müssen, ist dies alles, was Sie benötigen, um isolierte, projektspezifische virtuelle Umgebungen zu erstellen.

pyenv

Wenn Sie mehrere Versionen von Python auf einem einzelnen Computer verwenden möchten, pyenvist dies ein häufig verwendetes Tool zum Installieren und Wechseln zwischen Versionen. Dies ist nicht mit dem zuvor erwähnten abgeschriebenen pyvenvSkript zu verwechseln . Es wird nicht mit Python geliefert und muss separat installiert werden.

Die pyenvDokumentation enthält eine ausführliche Beschreibung der Funktionsweise. Daher sehen wir uns hier einfach die Verwendung an.

Zuerst müssen wir es installieren. Wenn Sie Mac OS X verwenden, können Sie dies mit Homebrew tun, andernfalls sollten Sie andere Installationsoptionen in Betracht ziehen.

$ brew update $ brew install pyenv

Fügen Sie als Nächstes am Ende Ihrer Shell-Skripte Folgendes hinzu, damit Sie die pyenvVersionen automatisch für Sie ändern können:

eval "$(pyenv init -)"

Öffnen Sie dazu Ihre im Einsatz Shell - Skript, über $ ~/.zshrc, $ ~/.bashrcoder $ ~/.bash_profileund kopieren und einfügen , die obige Zeile in.

Beim Ausführen pyenv versionswird angezeigt, welche Python-Versionen derzeit installiert sind, und eine *neben der aktuell verwendeten. pyenv versionzeigt dies direkt an und python --versionkann verwendet werden, um dies zu überprüfen.

Um beispielsweise eine zusätzliche Version zu installieren 3.4.0, verwenden Sie einfach pyenv install 3.4.0.

pyenv Suchen Sie an vier Stellen nach Prioritäten für die zu verwendende Python-Version:

  1. Die PYENV_VERSIONUmgebungsvariable (falls angegeben). Mit dem pyenv shellBefehl können Sie diese Umgebungsvariable in Ihrer aktuellen Shell-Sitzung festlegen.
  2. Die anwendungsspezifische .python-versionDatei im aktuellen Verzeichnis (falls vorhanden). Sie können die .python-versionDatei des aktuellen Verzeichnisses mit dem pyenv localBefehl ändern .
  3. Die erste .python-versionDatei, die (falls vorhanden) durch Durchsuchen jedes übergeordneten Verzeichnisses gefunden wurde, bis das Stammverzeichnis Ihres Dateisystems erreicht ist.
  4. Die globale Versionsdatei. Sie können diese Datei mit dem pyenv globalBefehl ändern . Wenn die globale Versionsdatei nicht vorhanden ist, geht pyenv davon aus, dass Sie das Python "System" verwenden möchten. (Mit anderen Worten, welche Version auch immer laufen würde, wenn pyenv nicht in Ihrer wäre PATH.)

Wenn Sie ein neues Projekt einrichten, das Python 3.6.4 verwenden pyenv local 3.6.4soll, wird es in seinem Stammverzeichnis ausgeführt. Dies würde sowohl die Version festlegen als auch eine .python-versionDatei erstellen , so dass die Computer anderer Mitwirkender sie abholen würden.

Die vollständige Beschreibung der pyenvBefehle ist ein Lesezeichen.

pyenv und venv

Wenn Sie mit Python 3.3+ arbeiten, wissen wir jetzt sowohl, wie Sie verschiedene Versionen von Python installieren und zwischen diesen wechseln, als auch wie Sie neue virtuelle Umgebungen erstellen.

Nehmen wir als Beispiel an, wir haben ein Projekt eingerichtet, das Python 3.4 verwenden soll.

Zuerst konnten wir unsere lokale Version mit einstellen pyenv local 3.4.0.

Wenn wir dann python3 -m venv example-projectlaufen würden, würde eine neue virtuelle Umgebung unter example-projectVerwendung unseres lokal aktivierten Python 3.4.0 eingerichtet.

Wir aktivieren mit source example-project/bin/activateund können anfangen zu arbeiten.

Als nächstes könnten wir optional dokumentieren, dass ein Mitarbeiter verwenden sollte python3.4 -m venv . Dies bedeutet, dass selbst wenn ein Mitarbeiter pyenv nicht verwendet, der python3.4Befehl einen Fehler verursacht, wenn seine Python-Version nicht dieselbe Haupt- und Nebenversion (3 und 4) ist, wie wir es beabsichtigt haben.

Alternativ können Sie einfach angeben, dass 3.4.0 verwendet werden soll, und Anweisungen geben python3 -m venv . Wenn wir der Meinung sind, dass eine Version größer als 3.4 akzeptabel ist, können wir uns auch für die Verwendung von python3over entscheiden python3.4, als ob der Mitarbeiter 3.6 verwenden würde, dann würden sie ansonsten auch einen Fehler erhalten. Dies ist eine projektspezifische Entscheidung.

pyenv-virtualenv

pyenvkann verwendet werden, um sowohl Python 2 als auch 3 Versionen zu installieren. Wie wir gesehen haben, venvist es jedoch auf Python-Versionen größer als 3.3 beschränkt.

pyenv-virtualenvist ein Tool zum Erstellen virtueller Umgebungen pyenv, das in Python integriert ist und für alle Versionen von Python funktioniert. Es wird weiterhin empfohlen, nach Möglichkeit das offizielle Python venvzu verwenden. Wenn Sie beispielsweise eine virtuelle Umgebung basierend auf erstellen 2.7.13, ist dies ein Kompliment pyenv.

Es funktioniert auch gut mit Anaconda- und Miniconda- condaUmgebungen, wenn Sie diese bereits verwenden. Es virtualenvgibt auch ein Tool namens . Es wird hier nicht behandelt, aber es ist am Ende verlinkt.

Nach der Installation pyenvkann es als nächstes mit Homebrew (oder Alternativen) wie folgt installiert werden:

$ brew install pyenv-virtualenv

Als nächstes in Ihrem .zshrc, .bashrcoder .bash_profile(je nachdem , welche Shell Sie verwenden) folgendes zum Boden hinzu:

eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"

Dies ermöglicht pyenvdas automatische Aktivieren und Deaktivieren von Umgebungen beim Verschieben von Verzeichnissen.

Verwenden Sie zum Erstellen einer neuen virtuellen Umgebung:

$ pyenv virtualenv   // for example $ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10

Bestehende Umgebungen können aufgelistet werden mit:

$ pyenv virtualenvs

Aktiviert / deaktiviert mit:

$ pyenv activate  $ pyenv deactivate

Zum Zeitpunkt des Schreibens wird bei Verwendung activatedie Warnung prompt changing will be removed from future releaseangezeigt. Dies wird erwartet und bezieht sich nur auf die (env-name)Anzeige in Ihrer Shell, nicht auf die Verwendung des activateBefehls selbst.

Die Installation der Anforderungen funktioniert wie in beschrieben venv. Anders als in venveinem rm -rBefehl, der zum Entfernen einer Umgebung nicht benötigt wird, uninstallexistiert ein Befehl.

Abschließende Gedanken

Zwischen diesen drei Tools können wir an jedem Projekt zusammenarbeiten, unabhängig von der Version von Python oder den erforderlichen Abhängigkeiten. Wir wissen auch, wie man Einrichtungsanweisungen dokumentiert, die andere für jedes Projekt verwenden können, an dem wir arbeiten.

Wir können auch die Gründe für die Verwendung des Sets erkennen, da nicht alle Entwickler alle drei benötigen.

Hoffentlich war dies hilfreich und ist eine nützliche Referenz in Kombination mit der unten verlinkten Dokumentation.

Danke fürs Lesen! ?

Andere Dinge, die ich erforscht habe:

  • Verspotten von ES- und CommonJS-Modulen mit jest.mock ()
  • Ein Leitfaden für Anfänger zum Elastic Container Service von Amazon

Ressourcen

  • Virtuelle Python-Umgebungen: Eine Einführung
  • Abwertend pyvenv
  • Python- venvDokumentation
  • venv vs. virtualenv
  • Was ist der Unterschied zwischen venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv usw.?
  • Muss ich installieren pip?