Verwendung von pyenv zum Ausführen mehrerer Python-Versionen auf einem Mac
Die Verwaltung einer lokalen Python-Entwicklungsumgebung ist selbst für erfahrene Entwickler weiterhin eine Herausforderung. Während es gut dokumentierte Strategien für die Paketverwaltung gibt, ist ein weiterer Schritt erforderlich, um sicherzustellen, dass Sie die Version von Python ausführen, die Sie benötigen, wenn Sie sie benötigen.
Warum ist die Version von Python wichtig?
Es ist zunächst ein seltsames Konzept, aber Programmiersprachen ändern sich wie jede andere Software. Sie haben Fehler, Korrekturen und Updates wie jede Ihrer Lieblings-APIs und jede andere Software. In ähnlicher Weise werden verschiedene Versionen durch eine dreistellige Nummer identifiziert, die als semantische Version bezeichnet wird.
😭😭😭 pic.twitter.com/yt1Z2439W8
– Denny Perez (@dennyperez18) 28. Mai 2019
Viele Jahre lang war Python 2 die am häufigsten verwendete Hauptversion der Programmiersprache. Im Januar 2020 erreichte Python 2 das Ende der Lebensdauer, und nur Python 3 wird von den Kernbetreuern der Sprache von nun an unterstützt. Python 3 entwickelt sich stetig weiter und veröffentlicht regelmäßig neue Updates. Deshalb ist es mir wichtig, diese Updates regelmäßig zu erhalten.
Kürzlich habe ich versucht, ein Projekt unter macOS auszuführen, das von Python 3.5.9 abhing, einer Version, die ich nicht auf meinem System installiert hatte. Es mag logisch erscheinen zu glauben, dass der Python-Paketmanager pip es installieren könnte*, aber das war nicht der Fall:
$ pip install python3.5.9
Collecting python3.5.9
ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none)
ERROR: No matching distribution found for python3.5.9
Alternativ hätte ich diese Version von der offiziellen Python-Website herunterladen können, aber wie würde ich sie neben meiner vorhandenen Python-Version auf meinem Mac ausführen? Angeben der Version von Python, die ich jedes Mal verwenden möchte, wenn ich den Interpreter ausführe (python3.7 oder Python3.5 zum Beispiel) scheint bestenfalls fehleranfällig zu sein. Es muss einen besseren Weg geben.
(Ein Hinweis zu obigem: Ich weiß, dass dies für erfahrene Python-Entwickler keinen Sinn macht, aber es machte zu der Zeit Sinn für mich. Ich würde gerne darüber sprechen, warum ich immer noch denke, dass es sollte.)
pyenv installieren und einrichten
Zum Glück gibt es pyenv, um diese Reihe von Komplexitäten zu umgehen. Um zu beginnen, musste ich pyenv installieren. Ich könnte es selbst aus dem Quellcode klonen und kompilieren, aber ich bevorzuge es, solche Pakete über den Homebrew-Paketmanager zu verwalten:
$ brew install pyenv
Um die Version von Python über pyenv zu verwenden, ist es wichtig, die PATH-Variable der Shell zu verstehen. PFAD bestimmt, wo die Shell nach Dateien anhand des Namens des Befehls sucht. Sie müssen sicherstellen, dass die Shell die von pyenv ausgeführte Python-Version findet, nicht die standardmäßig installierte (die oft als Systemversion bezeichnet wird). Wenn Sie den Pfad nicht ändern, ist hier das Ergebnis:
$ which python
/usr/bin/python
Das ist die Systemversion von Python.
Um pyenv korrekt einzurichten, können Sie Folgendes in Bash oder zsh ausführen:
$ PATH=$(pyenv root)/shims:$PATH
Wenn Sie nun die Version von Python überprüfen, werden Sie feststellen, dass sie von pyenv verwaltet wird:
$ which python
/Users/my_username/.pyenv/shims/python
Diese Exportanweisung (PATH=) ändert sich nur für diese Shell-Instanz. Da zsh offiziell die Standard-Shell von macOS ist, werde ich mich darauf konzentrieren. Fügen Sie dieselbe Syntax an ~ / an.zshrc-Datei:
$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc
Jedes Mal, wenn wir einen Befehl in zsh ausführen, wird die pyenv-Version von Python verwendet. Beachten Sie, dass ich mit echo einfache Anführungszeichen verwendet habe, damit die Befehle nicht ausgewertet und erweitert werden.
Die .überprüfen Sie daher unbedingt, was Ihre Shell ist, und bearbeiten Sie die zugehörigen dotfiles. Wenn Sie überprüfen müssen, was Ihre Standard-Shell ist, können Sie echo $SHELL ausführen. Wenn es sich um zsh handelt, verwenden Sie den obigen Befehl. Wenn Sie Bash verwenden, ändern Sie ~/ .zshrc zu ~/.in: bashrc. Sie können tief in die Pfadeinstellung in pyenvs README eintauchen, wenn Sie mehr erfahren möchten.
pyenv verwenden, um Python-Versionen zu verwalten
Nun, da pyenv die Kontrolle hat, können wir sehen, dass es nur das System Python zur Verfügung hat:
$ pyenv versions
system
Wie oben erwähnt, möchten Sie diese Version absolut nicht verwenden (lesen Sie mehr darüber, warum). Jetzt, da pyenv korrekt eingerichtet ist, möchte ich, dass es einige verschiedene Versionen von Python gibt, die ich regelmäßig verwende.
Es gibt eine Möglichkeit, alle verfügbaren Python-Versionen aus den verschiedenen Repositorys anzuzeigen, auf die pyenv Zugriff hat, indem pyenv install –list . Es ist eine lange, überwältigende Liste, die in Zukunft hilfreich sein kann. Im Moment bleibe ich bei der neuesten Version jedes Dot-Releases (3.5.x oder 3.6.x, wobei x das neueste ist) auf der Python-Download-Seite. In diesem Sinne installiere ich 3.5.9 und 3.8.0:
$ pyenv install 3.5.9
$ pyenv install 3.8.0
Dies wird eine Weile dauern, also holen Sie sich Tee (oder lesen Sie einen der obigen Links). Es ist interessant festzustellen, dass die Ausgabe den Download und das Erstellen dieser Version von Python durchläuft. Zum Beispiel zeigt die Ausgabe, dass die Datei direkt von Python.org .
Sobald alles installiert ist, können Sie Ihre Standardeinstellungen einrichten. Ich lebe gerne auf dem neuesten Stand, also setze ich meine globale Standard-Python-Version auf die neueste:
$ pyenv global 3.8.0
Und diese Version wird sofort in meiner Shell festgelegt. Zur Bestätigung:
$ python -V
Python 3.8.0
Das Projekt, das ich ausführen möchte, funktioniert nur mit Python 3.5, also setze ich die Version lokal und bestätige, dass sie verwendet wird:
$ pyenv local 3.5.9
$ python -V
Python 3.5.9
Da ich die lokale Option mit pyenv verwendet habe, wurde meinem aktuellen Verzeichnis eine Datei hinzugefügt, um diese Informationen zu verfolgen.
$ cat .python-version
3.5.9
Jetzt kann ich endlich eine virtuelle Umgebung für das gewünschte Projekt einrichten und sicher sein, dass ich die richtige Version von Python ausführe.
$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python
Weitere Informationen finden Sie in diesem Tutorial zum Verwalten virtueller Umgebungen auf einem Mac.
Einpacken
Standardmäßig kann das Ausführen mehrerer Python-Versionen eine Herausforderung sein. Ich finde, beginnend mit pyenv stellt sicher, dass ich die Versionen von Python habe, die ich einrichten muss, um sie auszuführen, wenn ich sie brauche.