Hvordan bruke pyenv til å kjøre flere versjoner Av Python på En Mac
Administrere et lokalt Python utviklingsmiljø fortsetter å være en utfordring, selv for erfarne utviklere. Mens det er veldokumenterte strategier for pakkehåndtering, er det et annet skritt som er nødvendig for å sikre at du kjører Den versjonen Av Python du trenger når du trenger det.
Hvorfor er Versjonen Av Python viktig?
det er et merkelig konsept først, men programmeringsspråk endres som enhver annen programvare. De har feil, feilrettinger og oppdateringer som noen av dine favoritt-Apier og annen programvare. Tilsvarende igjen identifiseres forskjellige utgivelser med et tresifret tall kjent som en semantisk versjon.
😭 😭 😭 pic.twitter.com/yt1Z2439W8— / p > – Denny Perez (@dennyperez18) 28. Mai 2019
I mange år var Python 2 den mest brukte hovedversjonen av programmeringsspråket. I januar 2020 Nådde Python 2 slutten av livet, og Bare Python 3 vil bli støttet av språkets kjernevedlikeholdere fra da av. Python 3 utvikler seg jevnt og slipper nye oppdateringer regelmessig. Det gjør det viktig for meg å regelmessig få disse oppdateringene.
nylig prøvde Jeg å kjøre et prosjekt på macOS som var avhengig Av Python 3.5.9, en versjon som jeg ikke hadde installert på systemet mitt. Det kan virke logisk å tro At Python package manager pip kunne installere den*, men det var ikke tilfelle:
$ 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 kunne Jeg ha lastet ned den versjonen fra Den offisielle Python-nettsiden, men hvordan ville jeg kjøre Den inn på Min Mac sammen med min eksisterende versjon av Python? Angi hvilken Versjon Av Python jeg har tenkt å bruke hver gang jeg kjører tolken (python3.7 eller python3. 5 for eksempel) virker feilaktig i beste fall. Det må finnes en bedre måte.(et notat på ovenstående: jeg vet at dette ikke gir mening for erfaren Python-utvikler, men det var fornuftig for meg på den tiden. Jeg vil gjerne snakke om hvorfor jeg fortsatt tror det skal.)
Installere og sette opp pyenv
heldigvis eksisterer pyenv for å omgå denne serien av kompleksiteter. For å starte, trengte jeg å installere pyenv. Jeg kunne klone og kompilere det selv fra kilde, men jeg foretrekker å administrere pakker som dette gjennom Homebrew package manager:
$ brew install pyenv
for å kunne bruke Versjonen Av Python gjennom pyenv, er det viktig å forstå skallets STI variabel. BANE bestemmer hvor skallet søker etter filer ved navn på kommandoen. Du må sørge for at skallet finner versjonen Av Python som drives av pyenv, ikke den som er installert som standard (som ofte kalles systemversjonen). Hvis du ikke endrer banen, her er resultatet:
$ which python
/usr/bin/python
det er systemversjonen Av Python.
for å sette opp pyenv riktig, kan du kjøre følgende I Bash eller zsh:
$ PATH=$(pyenv root)/shims:$PATH
nå, hvis du sjekker Versjonen Av Python, vil du se at det er den som administreres av pyenv:
$ which python
/Users/my_username/.pyenv/shims/python
den eksport setningen (PATH=) vil bare endres for denne shell-forekomsten, så gjør det til en permanent endring, du må legge den til dotfiles. Siden zsh er offisielt macOS standard skall, vil jeg fokusere på det. Tilføy den samme syntaksen til~/.zshrc-fil:
$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc
nå hver gang vi kjører en kommando i zsh, vil den bruke pyenv-versjonen Av Python. Merk at jeg brukte enkelt anførselstegn med ekko, slik at det ikke evaluerer og utvider kommandoene.
Den .zshrc fil bare klarer zsh forekomster, så sørg for å sjekke hva skallet er og redigere tilhørende dotfiles. Hvis du trenger å dobbeltsjekke hva standardskallet ditt er, kan du kjøre echo $SHELL. Hvis det er zsh, bruk kommandoen ovenfor. Hvis Du bruker Bash, endre ~/.zshrc til~/.bashrc. Du kan dykke dypt inn i sti innstilling i pyenv ER README hvis du ønsker å lære mer.
Bruke pyenv å administrere Python versjoner
Nå som pyenv er i kontroll, kan vi se det bare har Systemet Python tilgjengelig for det:
$ pyenv versions
system
som nevnt ovenfor, du absolutt ikke ønsker å bruke denne versjonen (les mer om hvorfor). Nå som pyenv er satt opp riktig, vil jeg at den skal ha noen forskjellige versjoner Av Python som jeg regelmessig bruker.Det er en måte å se Alle Python-versjoner tilgjengelig fra alle de forskjellige repositoriene pyenv har tilgang til ved å kjøre pyenv install — list. Det er en lang, overveldende liste som kan være nyttig å vurdere i fremtiden. For nå holder jeg meg til det siste av hver dot-utgivelse (3.5.x eller 3.6.x hvor x er den siste) funnet på Python nedlastingssiden. Med det i tankene installerer jeg 3.5.9 og 3.8.0:
$ pyenv install 3.5.9
$ pyenv install 3.8.0
dette vil ta en stund, så få litt te (eller les en av linkene ovenfor). Det er interessant å merke seg at utgangen går gjennom nedlasting og bygging av den versjonen Av Python. For eksempel viser utdataene at filen kommer direkte fra Python.org.
når alt er installert, kan du sette opp standardinnstillingene dine. Jeg liker å leve i forkant, så jeg satte min globale Standard Python-versjon til den nyeste:
$ pyenv global 3.8.0
Og den versjonen er umiddelbart satt i skallet mitt. For å bekrefte:
$ python -V
Python 3.8.0
prosjektet jeg vil kjøre fungerer bare Med Python 3.5, så jeg setter versjonen lokalt og bekrefter at den er i bruk:
$ pyenv local 3.5.9
$ python -V
Python 3.5.9
fordi jeg brukte det lokale alternativet med pyenv, la det en fil til min nåværende katalog for å spore denne informasjonen.
$ cat .python-version
3.5.9
nå kan jeg endelig sette opp et virtuelt miljø for prosjektet jeg vil ha og være sikker på at jeg kjører den riktige versjonen Av Python.
$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python
for å lære mer, sjekk ut denne veiledningen om å administrere virtuelle miljøer på En Mac.
Innpakning
som standard kan det være en utfordring å kjøre flere Python-versjoner. Jeg finner start med pyenv sikrer at jeg har versjoner Av Python jeg trenger satt opp for å kjøre når jeg trenger dem.