lunedì 25 novembre 2013

Anteprima pyenv, il tool per installare e gestire più versioni di Python

Pyenv è un tool per l'installazione e la gestione di versioni multiple di Python su sistemi Unix/Linux e Mac OS X.

Grazie a pyenv potete installare tutte le versioni che volete di Python a partire dalla vecchissima 2.4, credo risalga al 2004, fino alla versione 3.4 ancora in fase di sviluppo nel momento in cui scrivo.

La facilità d'installazione è davvero disarmante: basta un comando con l'indicazione della versione di Python che volete sul vostro sistema, e a tutto il resto ci pensa pyenv.

Vi scarica il sorgente di Python, ve lo compila, e vi installa il tutto in un'apposita directory creata in automatico nella home dell'utente, così da non sporcare l'installazione di default di Python eventualmente già presente sul vostro sistema.

Ad esempio sulla mia Ubuntu 12.04 LTS ho già installati Python 2.7.3 e Python 3.2.3 direttamente dai repository della distribuzione. Grazie a pyenv ho installato anche la versione 2.7.6 e la 3.3.3 senza che esse interferiscano minimamente con le altre.

La comodità dell'installazione di Python con pyenv è eccezionale, ma il meglio deve ancora arrivare perché pyenv tira fuori il meglio di se quando lo usate per gestire quale versione o versioni, si, anche più d'una contemporaneamente, volete usare sul vostro sistema.

Ad esempio, potete sostituire l'uso della versione 2.7.3 con la 2.7.6 in tutto il sistema, oppure solo in una specifica directory: quando siete in questa directory, se avviate Python parte la versione 2.7.6 come qui sotto,

$ python
Python 2.7.6 (default, Nov 22 2013, 09:22:29)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.


ma appena uscite da questa directory riprende a funzionare la solita 2.7.3:

$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.


E se volete, potete arrivare ad una granularità così fine da configurare l'uso di una certa versione di Python solo all'interno della shell (terminale) corrente.

Ma non finisce qui, perché come vi dicevo, nulla vi vieta di configurare l'uso di più versioni di Python contemporaneamente, ad esempio la 2.6, 2.7 e la 3.3, così da poter ad esempio fare delle prove e assicurarvi che il vostro software sia compatibile con tutte e tre:

$ python2.6
Python 2.6.9 (unknown, Nov 22 2013, 22:52:18)
[GCC 4.6.3] on linux3
Type "help", "copyright", "credits" or "license" for more information.


$ python2.7
Python 2.7.6 (default, Nov 22 2013, 09:22:29)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.


$ python3.3
Python 3.3.3 (default, Nov 22 2013, 09:28:26)
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.


Non vi ho ancora convinti della bontà di pyenv?

Allora sappiate che in ogni versione di Python che pyenv installa sul vostro sistema ci trovate anche pip, il gestore di pacchetti Python che dalla versione 3.4 è disponibile di default.

A questo punto anche l'installazione di ulteriori pacchetti Python, da Django passando per SciPy fino a PIL/Pillow e tutto il resto dell'immenso repository che è PyPI (Python Package Index) con i suoi 37036 pacchetti al momento in cui scrivo (e continua a crescere), diventa questione di un solo comando pyenv: poi come al solito ci pensa lui a tutto il resto.

Non vi ho ancora convinti a provare pyenv? Caspita quanto siete difficili! :-D
Allora è arrivato il momento di metter giù il carico da 90.

Che ne dite se con pyenv oltre a pip, il gestore di pacchetti Python, potete usare anche virtualenv, il tool per la creazione di ambienti virtuali Python? Non direttamente, per farlo bisogna prima installare un apposito plugin, pyenv-virtualenv, ma è questione di attimi ed una volta fatto gestire virtualenv diventa un gioco da ragazzi.

Grazie a virtualenv potete creare uno o più ambienti virtuali Python completamente isolati dal resto del sistema così da non interferire con esso. In ognuno di questi ambienti virtuali avrete una copia del Python di sistema su cui installare tutte le librerie che volete, e nella versione che più vi aggrada.

Per esempio, in un ambiente virtuale installate Django 1.5, in un altro la versione 1.6, e tutto questo senza che si crei il minimo conflitto tra di loro, ne con le librerie di sistema perché ognuna ha il suo ambiente virtuale completamente isolato da tutto il resto.

Il limite di questa soluzione è che comunque la vostra scelta della versione di Python disponibile nell'ambiente virtuale è limitata a quelle installate sul sistema. Ad esempio, sulla mia Ubuntu 12.04 sono le già citate versioni 2.7.3 e 3.2.3

Ma l'accoppiata pyenv + virtualenv gestito tramite il plugin pyenv-virtualenv è così potente che permette di superare questo limite: potete creare un ambiente virtuale scegliendo la versione di Python su cui costruirlo sia fra quelle di sistema, sia fra tutte quelle disponibili e installate in pyenv stesso, che lo ricordo vanno dalla 2.4 alla 3.4, e altre si aggiungeranno in futuro man mano saranno rese disponibili dalla comunità Python.

Per esempio, potreste costruire 3 ambienti virtuali completamente separati con:
  • Python 2.6 + Django 1.4;
  • Python 2.7 + Django 1.5;
  • Python 3.3 + Django 1.6;
Avete la totale libertà di scelta sia per quanto riguarda la versione Python da usare, sia per quanto riguarda le versioni delle varie librerie/moduli/framework che potete usare nel vostro lavoro: niente male, vero?

Un'ultima chicca: essendo basato su script Bash, pyenv non ha bisogno di Python per funzionare. Questo significa che potrete installarlo anche su macchine dove Python non è presente e godere lo stesso di tutti i vantaggi che abbiamo visto fin qui.

Su, ci dovremmo essere, dovreste ormai esservi convinti a provare pyenv.

Nella serie di post che seguiranno vedremo come installare e usare pyenv per renderci ancora più comoda e divertente la vita da programmatori Python.