Pipenv e come tutto è in uno

Io sono un appassionato di podcast. Mi piace ascoltarli quando vado in giro e quando vado in palestra. E uno di questi è quello di Kenneth Reitz, autore di svariati moduli python tra cui Requests che tutti i pythonisti conoscono e usano. L’ultimo progetto suo di mio interesse è PipEnv, sacro matrimonio di pipfile, pip e virtualenv.

Partiamo dalla base: per fare un progetto python solitamente si passano 3 fasi obligatorie

  • Si crea un virtualenv su cui lavorare, in cui i pacchetti installati non vanno in conflitto con quelli nel sistema ottenendo così un ambiente pulito su cui lavorare
  • Si fa una selezione dei moduli necessari per il progetto e li si installa nel virtualenv attraverso pip
  • Si produce dal virtualenv un file di requirements.txt che indica cosa è installato

Questo porta a dover tenere sempre aggiornato e pulito il virtualenv, sempre aggiornato il file requirements.txt e fissare le versioni minime richieste (o addirittura la versione stessa) del modulo nel requirements.txt.

PipEnv di conseguenza fa tutto questo per te con pochi e semplici comandi.

Ad esempio?

Mettiamo caso che io debba creare uno script in python che mi recuperi dei feed rss e me li salvi in locale.

  • Creo una cartella per il progetto, in modo da metterci tutto quello di cui ho bisogno

    mkdir progetto_python
    
  • Scelgo che versione di python usare, se quella corrente o quella legacy

    pipenv --three #versione corrente di python 3.x
    # alternativamente
    pipenv --two #legacy 2.7.x
    
  • Inizio a scrivere codice e a installare pacchetti necessari per il progetto

    pipenv install request
    pipenv install flask
    

Questi comandi assieme a quello iniziale, mi permette di creare un pipfile che descrive i moduli da me installati. La cosa più bella di questo pipfile è che permette di avere più “ambienti” indicati nello stesso file. Questo significa che posso avere “testing”, “travis”, “dev” e “prod” tutti descritti in un unico file e gestiti in modo automatico.

Quindi mi accordo che flask non mi serve più perchè ho riscritto tutto in modo da non usarlo e rendere in codice più leggibile… Quindi cosa faccio?

    pipenv uninstall flask

Questo comando elimina dal pipfile flask rendendolo così “pulito” e sempre aggiornato.

Una volta definito il pipfile bisogna creare il pipfile.lock, ovvero una versione automatica, generata dall’ “installazione corrente” in modo da riprodurre perfettamente l’ambiente.

    pipenv lock

Questo fissa i moduli installati con versione, hash e altri dati sia per i pacchetti indicati sia che con le loro dipendenze, in modo da ottenere tutte le indicazioni per riprodurre quel esatto ambiente.

Tutto qui?

No, il sistema crea all’inizio un virtualenv per il progetto e lo popola secondo le indicazioni passate dal terminale. Questo ambiente virtuale è accessibile attraverso il comando

    pipenv shell

che apre una shell nel virtualenv del progetto e permette di eseguire comandi nella stessa virtualenv.

In oltre PipEnv permette di convertire, se non presenti, i requirements.txt in pipfile e di aggiornare tutti i pacchetti attraverso

    pipenv update

Conclusione

Personalmente spero che questo sistema, o per lo meno pipfile, diventi lo standard per lo sviluppo di applicazioni python e soppianti i file requirements.txt che trovo particolarmente poco pratici e troppo sintetici anche se fanno esattamente quello per cui sono stati pensati

comments powered by Disqus