Hur man använder pyenv för att köra flera versioner av Python på en Mac
hantera en lokal Python utvecklingsmiljö fortsätter att vara en utmaning, även för erfarna utvecklare. Även om det finns väldokumenterade strategier för pakethantering, finns det ytterligare ett steg som krävs för att säkerställa att du kör den version av Python du behöver när du behöver den.
Varför spelar versionen av Python Roll?
det är ett konstigt koncept först, men programmeringsspråk ändras som alla andra program. De har buggar, korrigeringar och uppdateringar som någon av dina favorit API: er och annan programvara. På samma sätt identifieras olika utgåvor med ett tresiffrigt nummer som kallas en semantisk version.
exportorienterad pic.twitter.com/yt1Z2439W8
– Denny Perez (@dennyperez18) 28 maj 2019
under många år var Python 2 den vanliga huvudversionen av programmeringsspråket. I januari 2020 nådde Python 2 slutet av livet, och endast Python 3 kommer att stödjas av språkets kärnansvariga från och med då framåt. Python 3 utvecklas stadigt och släpper regelbundet nya uppdateringar. Det gör det viktigt för mig att regelbundet få dessa uppdateringar.
Nyligen försökte jag köra ett projekt på macOS som berodde på Python 3.5.9, en version som jag inte hade installerat på mitt system. Det kan tyckas logiskt att tro att Python-pakethanteraren pip kunde installera den*, men det var inte fallet:
$ 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
alternativt kunde jag ha laddat ner den versionen från den officiella Python-webbplatsen, men hur skulle jag köra den på min Mac tillsammans med min befintliga version av Python? Ange vilken version av Python Jag tänker använda varje gång jag kör tolken (python3.7 eller python3. 5 till exempel) verkar felbenägen i bästa fall. Det måste finnas ett bättre sätt.
(en anteckning på ovanstående: jag vet att det inte är meningsfullt för erfaren Python-utvecklare, men det var meningsfullt för mig då. Jag skulle gärna prata om varför jag fortfarande tycker att det borde.)
installera och konfigurera pyenv
Tack och lov finns pyenv för att arbeta runt denna serie komplexiteter. För att börja, behövde jag installera pyenv. Jag kunde klona och kompilera det själv från källan, men jag föredrar att hantera paket så här via Homebrew package manager:
$ brew install pyenv
För att kunna använda versionen av Python via pyenv är det viktigt att förstå skalets sökvägsvariabel. PATH bestämmer var skalet söker efter filer med namnet på kommandot. Du måste se till att skalet hittar versionen av Python som körs av pyenv, inte den som installeras som standard (som ofta kallas systemversionen). Om du inte ändrar sökvägen är här resultatet:
$ which python
/usr/bin/python
det är systemversionen av Python.
för att ställa in pyenv korrekt kan du köra följande i Bash eller zsh:
$ PATH=$(pyenv root)/shims:$PATH
Om du nu kontrollerar versionen av Python ser du att den är den som hanteras av pyenv:
$ which python
/Users/my_username/.pyenv/shims/python
att exportdeklarationen (PATH=) bara ändras för den här skalinstansen, så gör det till en permanent ändring, du måste lägga till den i dina dotfiles. Eftersom zsh officiellt är macOS: s standardskal, kommer jag att fokusera på det. Lägg till samma syntax till~/.zshrc-fil:
$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc
nu varje gång vi kör ett kommando i zsh kommer det att använda pyenv-versionen av Python. Observera att jag använde enstaka citat med echo så att det inte utvärderar och utökar kommandona.
den .zshrc-filen hanterar bara zsh-instanser, så se till att kontrollera vad ditt skal är och redigera tillhörande dotfiles. Om du behöver dubbelkontrollera vad ditt standardskal är kan du köra echo $SHELL. Om det är zsh, använd kommandot ovan. Om du använder Bash, ändra ~/.zshrc till~/.bashrc. Du kan dyka djupt in i baninställningen i pyenvs README om du vill lära dig mer.
använda pyenv för att hantera Python-versioner
Nu när pyenv är i kontroll kan vi se att det bara har systemet Python tillgängligt för det:
$ pyenv versions
system
som nämnts ovan vill du absolut inte använda den här versionen (läs mer om varför). Nu när pyenv är korrekt inställd vill jag att den ska ha några olika versioner av Python som jag regelbundet använder.
det finns ett sätt att se alla Python-versioner tillgängliga från alla olika repositories pyenv har tillgång till genom att köra pyenv install-list. Det är en lång, överväldigande lista som kan vara till hjälp att granska i framtiden. För tillfället håller jag fast vid det senaste av varje dot-release (3.5.x eller 3.6.x där x är den senaste) finns på Python nedladdningssida. Med det i åtanke installerar jag 3.5.9 och 3.8.0:
$ pyenv install 3.5.9
$ pyenv install 3.8.0
det här tar ett tag, så få lite te (eller läs en av länkarna ovan). Det är intressant att notera att produktionen går igenom nedladdningen och byggandet av den versionen av Python. Till exempel visar utgången att filen kommer direkt från Python.org.
När allt är installerat kan du ställa in standardinställningarna. Jag gillar att leva i framkant, så jag ställer in min globala standard Python-version till det senaste:
$ pyenv global 3.8.0
och den versionen ställs omedelbart in i mitt skal. För att bekräfta:
$ python -V
Python 3.8.0
projektet Jag vill köra fungerar bara med Python 3.5, så jag ställer in versionen lokalt och bekräftar att den används:
$ pyenv local 3.5.9
$ python -V
Python 3.5.9
eftersom jag använde det lokala alternativet med pyenv lade det till en fil i min nuvarande katalog för att spåra den informationen.
$ cat .python-version
3.5.9
Nu kan jag äntligen skapa en virtuell miljö för det projekt jag vill ha och vara säker på att jag kör rätt version av Python.
$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python
för att lära dig mer, kolla in den här handledningen om hantering av virtuella miljöer på en Mac.
inslagning upp
som standard kan köra flera Python-versioner vara en utmaning. Jag tycker att jag börjar med pyenv säkerställer att jag har versionerna av Python som jag behöver ställa in för att köra när jag behöver dem.