Pyenv consente di gestire più versioni di Python nello stesso ambiente.

Non bisogna confonderlo con venv o virtualenv che servono, invece, a gestire degli ambienti separati della stessa versione di python.

Situazione iniziale§

Abbiamo installato Python. Sarà da qualche parte, no? Python di sistema si trova così:

$ which python
> /usr/bin/python

Quale versione?

$ python -V
> Python 2.7.12

Come si installa Pyenv?§

Dipendenze su Ubuntu/Debian:

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

Dipendenze su Alpine:

apk add libffi-dev ncurses-dev openssl-dev readline-dev \
tk-dev xz-dev zlib-dev

Installare pyenv con uno script di bash:

$ curl https://pyenv.run | bash

Probabilmente un warning ci avviserà della necessità di aggiungere alcune righe a `.bashrc`. Aggiungere le seguenti:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Riavviare la shell.

Visualizzare le versioni disponibili§

$ pyenv install --list

Restituisce la lista di versione installabili. Sono molte, ma è segno che è andato tutto bene.

Installare una versione di Python§

$ pyenv install 3.7.7

# Downloading Python-3.7.7.tar.xz...
# -> https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tar.xz
# Installing Python-3.7.7...
# Installed Python-3.7.7 to /home/usr/.pyenv/versions/3.7.7

È consigliabile spostarsi nella root del progetto che ci interessa e stabilire quale versione usare localmente:

$ pyenv local 3.7.7

Questo genera un file .python-version che tiene in memoria la versione di python che pyenv andrà ad utilizzare quando noi lanciamo comandi da quella posizione.

Infatti:

$ cat .python-version
# > 3.7.7

Ora puoi usare Python come al solito e pip sarà associato automaticamente alla versione corretta.