Articles

Hoe pyenv te gebruiken om meerdere versies van Python uit te voeren op een Mac

het beheren van een lokale Python-ontwikkelomgeving blijft een uitdaging, zelfs voor ervaren ontwikkelaars. Hoewel er goed gedocumenteerde strategieën voor pakketbeheer zijn, is er nog een stap nodig om ervoor te zorgen dat je de versie van Python draait die je nodig hebt wanneer je het nodig hebt.

Waarom is de versie van Python belangrijk?

Het is een vreemd concept in het begin, maar programmeertalen veranderen zoals elke andere software. Ze hebben bugs, fixes en updates zoals elk van uw favoriete API ‘ s en andere software. Op dezelfde manier worden verschillende releases geà dentificeerd door een driecijferig getal dat bekend staat als een semantische versie.

😭 😭 😭 pic.twitter.com/yt1Z2439W8

— Denny Perez (@dennyperez18) May 28, 2019

gedurende vele jaren was Python 2 de veelgebruikte hoofdversie van de programmeertaal. In januari 2020, Python 2 bereikt einde van het leven, en alleen Python 3 zal worden ondersteund door de kern beheerders van de taal vanaf dan. Python 3 ontwikkelt zich gestaag en brengt regelmatig nieuwe updates uit. Dat maakt het belangrijk voor mij om regelmatig die updates te krijgen.

onlangs heb ik geprobeerd een project op macOS uit te voeren dat afhankelijk was van Python 3.5.9, een versie die ik niet op mijn systeem had geïnstalleerd. Het lijkt misschien logisch om te denken dat de Python package manager pip het zou kunnen installeren*, maar dat was niet het geval:

$ 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

als alternatief zou ik die versie van de officiële Python website kunnen gedownload hebben, maar hoe zou ik het op mijn Mac kunnen draaien naast mijn bestaande versie van Python? Het specificeren van de versie van Python die ik van plan ben te gebruiken elke keer als ik de interpreter (python3.7 of python3. 5 bijvoorbeeld) lijkt op zijn best foutgevoelig. Er moet een betere manier zijn.

(een opmerking over het bovenstaande: Ik weet dat dit geen zin heeft voor doorgewinterde Python ontwikkelaar, maar het was zinvol voor mij op het moment. Ik zou graag praten over waarom ik nog steeds denk dat het moet.)

pyenv installeren en instellen

Gelukkig bestaat pyenv om rond deze reeks complexiteiten te werken. Om te beginnen moest ik pyenv installeren. Ik zou het zelf kunnen klonen en compileren van de broncode, maar ik geef de voorkeur aan het beheren van pakketten als deze via de Homebrew package manager:

$ brew install pyenv

om de versie van Python via pyenv te kunnen gebruiken, is het essentieel om de PATH variabele van de shell te begrijpen. PATH bepaalt waar de shell naar bestanden zoekt met de naam van het commando. Je moet ervoor zorgen dat de shell de versie van Python zal vinden die door pyenv wordt uitgevoerd, niet degene die standaard is geïnstalleerd (wat vaak de systeemversie wordt genoemd). Als je het pad niet verandert, dan is hier het resultaat:

$ which python
/usr/bin/python

dat is de systeemversie van Python.

om pyenv correct in te stellen, kunt u het volgende uitvoeren in Bash of zsh:

$ PATH=$(pyenv root)/shims:$PATH

nu, als je de versie van Python controleert, zul je zien dat het de versie is die wordt beheerd door pyenv:

$ which python
/Users/my_username/.pyenv/shims/python

dat export statement (PATH=) zal alleen veranderen voor deze shell instantie, dus maak het een permanente verandering, je moet het toevoegen aan je dotfiles. Aangezien zsh officieel de standaard shell van macOS is, zal ik me erop concentreren. Voeg dezelfde syntaxis toe aan de~/.zshrc bestand:

$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc

nu zal elke keer dat we een commando uitvoeren in zsh, de pyenv versie van Python gebruiken. Merk op dat ik enkele aanhalingstekens met echo heb gebruikt, zodat het de commando ‘ s niet evalueert en uitbreidt.

De .zshrc bestand beheert alleen zsh instanties, dus zorg ervoor dat je controleert wat je shell is en bewerk de bijbehorende dotfiles. Als je dubbel moet controleren wat je standaard shell is, kun je echo $SHELL draaien. Als het zsh is, gebruik dan het bovenstaande commando. Als je Bash gebruikt, verander je~/.zshrc tot~/.bashrc. Je kunt diep duiken in pad instelling in pyenv ‘ s README als je meer wilt leren.

pyenv gebruiken om Python versies te beheren

nu pyenv de controle heeft, kunnen we zien dat het alleen het systeem Python beschikbaar heeft:

$ pyenv versions
system

zoals hierboven vermeld, wilt u deze versie absoluut niet gebruiken (Lees meer over waarom). Nu pyenv correct is ingesteld, wil ik dat het een paar verschillende versies van Python heeft die ik regelmatig gebruik.

Er is een manier om alle Python versies beschikbaar te zien van alle verschillende repositories waartoe pyenv toegang heeft door pyenv install –list uit te voeren. Het is een lange, overweldigende lijst die nuttig kan zijn om te herzien in de toekomst. Voor nu, ik blijf bij de nieuwste van elke dot-release (3.5.x of 3.6.x waar x de laatste is) gevonden op de Python download pagina. Met dat in gedachten installeer ik 3.5.9 en 3.8.0:

$ pyenv install 3.5.9
$ pyenv install 3.8.0

Dit zal even duren, dus haal wat thee (of lees een van de links hierboven). Het is interessant om op te merken dat de output loopt door het downloaden en bouwen van die versie van Python. De uitvoer laat bijvoorbeeld zien dat het bestand rechtstreeks afkomstig is van Python.org.

zodra alles is geïnstalleerd, kunt u uw standaardinstellingen instellen. Ik leef graag op de snijkant, dus stel ik mijn algemene standaard Python versie in op de laatste:

$ pyenv global 3.8.0

en die versie wordt onmiddellijk in mijn shell ingesteld. Om te bevestigen:

$ python -V
Python 3.8.0

het project dat Ik wil uitvoeren werkt alleen met Python 3.5, dus Ik zal de versie lokaal instellen en bevestigen dat het in gebruik is:

$ pyenv local 3.5.9
$ python -V
Python 3.5.9

omdat ik de lokale optie met pyenv heb gebruikt, is er een bestand toegevoegd aan mijn huidige map om die informatie te volgen.

$ cat .python-version
3.5.9

nu kan ik eindelijk een virtuele omgeving opzetten voor het project dat ik wil en er zeker van zijn dat ik de juiste versie van Python gebruik.

$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python

bekijk deze tutorial over het beheren van virtuele omgevingen op een Mac voor meer informatie.

afbreken

standaard kan het uitvoeren van meerdere Python-versies een uitdaging zijn. Ik vind beginnen met pyenv zorgt ervoor dat ik de versies van Python heb die ik nodig heb om te draaien wanneer ik ze nodig heb.