Articles

Cum se utilizează pyenv pentru a rula mai multe versiuni de Python pe un Mac

gestionarea unui mediu local de dezvoltare Python continuă să fie o provocare, chiar și pentru dezvoltatorii experimentați. Deși există strategii bine documentate pentru gestionarea pachetelor, există un alt pas necesar pentru a vă asigura că rulați versiunea Python de care aveți nevoie atunci când aveți nevoie.

De ce contează versiunea Python?

este un concept ciudat la început, dar limbajele de programare se schimbă ca orice alt software. Ei au bug-uri, remedieri și actualizări, cum ar fi oricare dintre API-urile preferate și orice alt software. În mod similar, diferite versiuni sunt identificate printr-un număr din trei cifre cunoscut sub numele de versiune semantică.

pic.twitter.com/yt1Z2439W8

— Denny Perez (@dennyperez18) 28 Mai 2019

timp de mulți ani, Python 2 a fost versiunea majoră utilizată în mod obișnuit a limbajului de programare. În ianuarie 2020, Python 2 a ajuns la sfârșitul vieții și numai Python 3 va fi susținut de întreținătorii de bază ai limbii de atunci înainte. Python 3 se dezvoltă constant și lansează noi actualizări în mod regulat. Asta face important pentru mine pentru a obține în mod regulat aceste actualizări.

recent, am încercat să rulez un proiect pe macOS care depindea de Python 3.5.9, o versiune pe care nu o aveam instalată pe sistemul meu. Ar putea părea logic să credem că managerul de pachete Python pip ar putea să-l instaleze*, dar nu a fost cazul:

$ 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, aș fi putut descărca acea versiune de pe site-ul oficial Python, dar cum aș rula-o pe Mac-ul meu alături de versiunea mea existentă de Python? Specificând versiunea Python pe care intenționez să o folosesc de fiecare dată când rulez interpretul (python3.7 sau python3.5 de exemplu) pare predispus la erori în cel mai bun caz. Trebuie să existe o cale mai bună.

(o notă despre cele de mai sus: știu că acest lucru nu are sens pentru dezvoltatorul Python condimentat, dar a avut sens pentru mine la acea vreme. Aș vorbi fericit despre motivul pentru care încă mai cred că ar trebui.)

instalarea și configurarea pyenv

Din fericire, pyenv există pentru a lucra în jurul acestei serii de complexități. Pentru a începe, am nevoie pentru a instala pyenv. Aș putea să-l clonez și să-l compilez singur de la sursă, dar prefer să gestionez astfel de pachete prin Managerul de pachete Homebrew:

$ brew install pyenv

pentru a utiliza versiunea Python prin pyenv, este esențial să înțelegem variabila de cale a shell-ului. Calea determină unde shell-ul caută fișiere după numele comenzii. Trebuie să vă asigurați că shell-ul va găsi versiunea Python condusă de pyenv, nu cea instalată implicit (care se numește adesea versiunea de sistem). Dacă nu schimbați calea, iată rezultatul:

$ which python
/usr/bin/python

aceasta este versiunea de sistem a Python.

pentru a configura corect pyenv, puteți rula următoarele în Bash sau zsh:

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

acum, dacă verificați versiunea Python, veți vedea că este cea gestionată de pyenv:

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

că declarația de export (PATH=) se va schimba doar pentru această instanță shell, deci faceți o schimbare permanentă, trebuie să o adăugați la dotfiles. Deoarece zsh este oficial shell-ul implicit al macOS, mă voi concentra asupra acestuia. Adăugați aceeași sintaxă la~/.fișier zshrc:

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

acum, de fiecare dată când rulăm o comandă în zsh, aceasta va folosi versiunea pyenv a Python. Rețineți că am folosit citate unice cu echo, astfel încât să nu evalueze și să extindă comenzile.

la .fișierul zshrc gestionează numai instanțele zsh, deci asigurați-vă că verificați ce este shell-ul dvs. și editați dotfiles asociate. Dacă trebuie să verificați de două ori care este shell-ul dvs. implicit, puteți rula echo $SHELL. Dacă este zsh, utilizați comanda de mai sus. Dacă utilizați Bash, schimbați ~/.zshrc la~/.bashrc. Vă puteți scufunda adânc în setarea căii în readme pyenv dacă doriți să aflați mai multe.

folosind pyenv pentru a gestiona versiunile Python

acum că pyenv este în control, putem vedea că are doar sistemul Python disponibil pentru acesta:

$ pyenv versions
system

după cum sa menționat mai sus, absolut nu doriți să utilizați această versiune (citiți mai multe despre De ce). Acum, că pyenv este configurat corect, vreau să aibă câteva versiuni diferite de Python pe care le folosesc în mod regulat.

există o modalitate de a vedea toate versiunile Python disponibile din toate depozitele diferite la care pyenv are acces rulând pyenv install –list. Este o listă lungă, copleșitoare, care ar putea fi utilă pentru revizuire în viitor. Deocamdată, rămân cu cea mai recentă versiune a fiecărui punct (3.5.x sau 3.6.X unde x este cel mai recent) găsit pe pagina de descărcare Python. Având în vedere acest lucru, voi instala 3.5.9 și 3.8.0:

$ pyenv install 3.5.9
$ pyenv install 3.8.0

Acest lucru va dura ceva timp, așa că obțineți un ceai (sau citiți unul dintre linkurile de mai sus). Este interesant de observat că ieșirea trece prin descărcarea și construirea acelei versiuni de Python. De exemplu, ieșirea arată că fișierul provine direct de la Python.org.

odată ce totul este instalat, puteți configura valorile implicite. Îmi place să trăiesc la marginea de taiere, asa ca am setat versiunea mea globală implicit Python la cele mai recente:

$ pyenv global 3.8.0

și că versiunea este setat imediat în shell-ul meu. Pentru a confirma:

$ python -V
Python 3.8.0

proiectul pe care vreau să-l rulez funcționează numai cu Python 3.5, așa că voi seta versiunea locală și voi confirma că este în uz:

$ pyenv local 3.5.9
$ python -V
Python 3.5.9

Pentru că am folosit opțiunea locală cu pyenv, a adăugat un fișier în directorul meu curent pentru a urmări aceste informații.

$ cat .python-version
3.5.9

acum, pot configura în sfârșit un mediu virtual pentru proiectul pe care îl doresc și să fiu sigur că rulez versiunea corectă a Python.

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

pentru a afla mai multe, consultați acest tutorial despre gestionarea mediilor virtuale pe un Mac.

împachetarea

în mod implicit, rularea mai multor versiuni Python poate fi o provocare. Mi se pare incepand cu pyenv asigură am versiunile de Python am nevoie configurat pentru a rula atunci când am nevoie de ele.