Articles

Come utilizzare pyenv per eseguire più versioni di Python su un Mac

La gestione di un ambiente di sviluppo Python locale continua ad essere una sfida, anche per gli sviluppatori esperti. Mentre ci sono strategie ben documentate per la gestione dei pacchetti, c’è un altro passo necessario per assicurarsi che si sta eseguendo la versione di Python è necessario quando ne avete bisogno.

Perché la versione di Python è importante?

All’inizio è un concetto strano, ma i linguaggi di programmazione cambiano come qualsiasi altro software. Hanno bug, correzioni e aggiornamenti come le tue API preferite e qualsiasi altro software. Allo stesso modo, diverse versioni sono identificate da un numero a tre cifre noto come versione semantica.

😭 😭 😭 pic.twitter.com/yt1Z2439W8

— Denny Perez (@dennyperez18) May 28, 2019

Per molti anni, Python 2 è stata la versione principale comunemente usata del linguaggio di programmazione. A gennaio 2020, Python 2 ha raggiunto la fine della vita, e solo Python 3 sarà supportato dai principali manutentori del linguaggio da allora in avanti. Python 3 si sta sviluppando costantemente e rilascia regolarmente nuovi aggiornamenti. Ciò rende importante per me ottenere regolarmente quegli aggiornamenti.

Recentemente, ho provato a eseguire un progetto su macOS che dipendeva da Python 3.5.9, una versione che non avevo installato sul mio sistema. Potrebbe sembrare logico pensare che il pip del gestore di pacchetti Python potesse installarlo*, ma non era così:

$ 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

In alternativa, avrei potuto scaricare quella versione dal sito Web ufficiale di Python, ma come avrei potuto eseguirla sul mio Mac insieme alla mia versione esistente di Python? Specificando la versione di Python che intendo utilizzare ogni volta che eseguo l’interprete (python3.7 o python3.5 per esempio) sembra soggetto a errori al meglio. Ci deve essere un modo migliore.

(Una nota su quanto sopra: so che questo non ha senso per lo sviluppatore Python esperto, ma aveva senso per me in quel momento. Sarei felice di parlare del motivo per cui penso ancora che dovrebbe.)

Installazione e configurazione di pyenv

Fortunatamente, pyenv esiste per aggirare questa serie di complessità. Per iniziare, avevo bisogno di installare pyenv. Potrei clonarlo e compilarlo da solo dal sorgente, ma preferisco gestire pacchetti come questo attraverso il gestore di pacchetti Homebrew:

$ brew install pyenv

Per poter utilizzare la versione di Python tramite pyenv, è essenziale comprendere la variabile PATH della shell. PATH determina dove la shell cerca i file in base al nome del comando. È necessario assicurarsi che la shell trovi la versione di Python eseguita da pyenv, non quella installata di default (che viene spesso chiamata la versione di sistema). Se non si modifica il percorso, ecco il risultato:

$ which python
/usr/bin/python

Questa è la versione di sistema di Python.

Per impostare correttamente pyenv, è possibile eseguire quanto segue in Bash o zsh:

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

Ora, se controlli la versione di Python, vedrai che è quella gestita da pyenv:

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

Che l’istruzione export (PATH=) cambierà solo per questa istanza della shell, quindi rendila una modifica permanente, devi aggiungerla ai tuoi dotfile. Poiché zsh è ufficialmente la shell predefinita di macOS, mi concentrerò su di esso. Aggiungi la stessa sintassi al~/.file zshrc:

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

Ora ogni volta che eseguiamo un comando in zsh, userà la versione pyenv di Python. Si noti che ho usato virgolette singole con echo in modo da non valutare ed espandere i comandi.

Il .il file zshrc gestisce solo le istanze zsh, quindi assicurati di controllare qual è la tua shell e modificare i dotfile associati. Se è necessario ricontrollare quale sia la shell predefinita, è possibile eseguire echo SHELL SHELL. Se è zsh, usa il comando sopra. Se usi Bash, cambia ~/.zshrc a~/.bashrc. Puoi immergerti in profondità nell’impostazione del percorso in README di pyenv se vuoi saperne di più.

Usare pyenv per gestire le versioni di Python

Ora che pyenv ha il controllo, possiamo vedere che ha solo il sistema Python disponibile:

$ pyenv versions
system

Come menzionato sopra, non vuoi assolutamente usare questa versione (leggi di più sul perché). Ora che pyenv è impostato correttamente, voglio che abbia alcune versioni diverse di Python che uso regolarmente.

C’è un modo per vedere tutte le versioni di Python disponibili da tutti i diversi repository a cui pyenv ha accesso eseguendo pyenv install list list. È una lista lunga e travolgente che potrebbe essere utile rivedere in futuro. Per ora, mi attengo con l’ultima di ogni dot-release (3.5.x o 3.6.x dove x è l’ultimo) trovato nella pagina di download di Python. Con questo in mente, installerò 3.5.9 e 3.8.0:

$ pyenv install 3.5.9
$ pyenv install 3.8.0

Ci vorrà un po’, quindi prendi un po ‘ di tè (o leggi uno dei link sopra). È interessante notare che l’output passa attraverso il download e la costruzione di quella versione di Python. Ad esempio, l’output mostra che il file proviene direttamente da Python.org.

Una volta installato tutto, è possibile impostare i valori predefiniti. Mi piace vivere all’avanguardia, quindi ho impostato la mia versione Python predefinita globale all’ultima:

$ pyenv global 3.8.0

E quella versione viene immediatamente impostata nella mia shell. Per confermare:

$ python -V
Python 3.8.0

Il progetto ” voglio correre funziona solo con Python 3.5, quindi non posso impostare la versione locale e conferma che è in uso:

$ pyenv local 3.5.9
$ python -V
Python 3.5.9

Perché ho usato l’opzione locale con pyenv, ha aggiunto un file al mio directory corrente per tenere traccia di tali informazioni.

$ cat .python-version
3.5.9

Ora, posso finalmente impostare un ambiente virtuale per il progetto che voglio ed essere sicuro che sto eseguendo la versione giusta di Python.

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

Per saperne di più, dai un’occhiata a questo tutorial sulla gestione degli ambienti virtuali su un Mac.

Concludere

Per impostazione predefinita, l’esecuzione di più versioni Python può essere una sfida. Trovo che a partire da pyenv assicuri di avere le versioni di Python di cui ho bisogno per essere eseguite quando ne ho bisogno.