Python 3 - Lezioni su Concetti Intermedi

11: Ambienti Virtuali con VENV (Virtual Environments)

Oggi parliamo di Virtual Environments in Python 3!

Virtual Environment sta per Ambiente Virtuale, e si tratta di una best practice che ci permette di creare degli spazi indipendenti dal resto del sistema in cui è possibile testare e lavorare con Python e pip.

La grande popolarità degli Ambienti Virtuali, è dovuta al fatto che ci consentono di lavorare e sperimentare con più progetti contemporaneamente nonostante magari questi utilizzino una versione diversa degli stessi moduli.

Inoltre ci permettono di installare moduli con pip senza i privilegi di root, con tutti i vantaggi in termini di sicurezza che questo comporta.

Concretamente avremo una cartella che conterrà vari file necessari al funzionamento dell'ambiente e una copia dei binary di Python, e dentro questa potremo poi installare tutti i moduli con la versione che vogliamo in base al progetto su cui stiamo lavorando, ma che richiederanno l'attivazione di questo ambiente per essere utilizzati.

Vediamo subito di cosa sto parlando. Anzitutto, per creare questi ambienti virtuali sono presenti svariati strumenti. In questo tutorial ci concentreremo sull'utilizzo di venv, che fa parte della Standard Library di Python 3.

Se diamo il comando "pip list" otteniamo in output una serie di moduli, che sono i vari package attualmente installati nell'ambiente principale del sistema.

Creiamo una cartella che ospiterà il nostro progetto:

>>> mkdir progetto_x1
>>> cd progetto_x1

Per creare un ambiente virtuale mi basta dare:

>>> python -m venv v_env_x1   # crezione ambiente virtuale
>>> cd v_env_x1                    # entro nella cartella appena generata dal comando precedente
>>> . bin/activate                 # attivo l'ambiente (su Windows invece di "bin" avrete una cartella "Scripts" )

ed ecco che ora siamo dentro al nuovo ambiente virtuale, caratterizzato dalla presenza del nome dell'ambiente, tra parentesi tonde, prima del percorso (v_env_x1)

Se ora rilancio il comando "pip list", ecco che abbiamo molti meno moduli di quanti ce n'erano nell'ambiente principale!

Abbiamo solo i moduli di default dell'ambiente virtuale appena creato... che aspetta solo noi per essere popolato!

Se diamo inoltre il comando:

>>> which python

Possiamo vedere anche che il percorso dell'eseguibile che stiamo utilizzando al momento è proprio questo dell'ambiente virtuale!

Possiamo quindi effettuare qualche installazione tramite pip. Supponiamo di voler utilizzare l'ambiente appena creato per testare django2.0 alpha1.

>>> pip install django==2.0a1
>>> pip install pillow

Ora che abbiamo installato i moduli necessari, siamo pronti per creare la nostra applicazione con Django!

>>> django-admin.py startproject test_alpha 
>>> cd test_alpha/
>>> python manage.py runserver

Una considerazione è comunque d'obbligo: l'Ambiente Virtuale non è stato pensato come un ambiente dentro al quale sviluppare, ma bensì come un ambiente che facilitasse lo sviluppo. Voglio dire, come fare ad esempio a condividere il nostro progetto appena creato, facendo in modo che anche gli sviluppatori futuri conoscere i moduli e le corrispondenti versioni associate, utilizzate dalla nostra applicazione?

In maniera molto semplice, possiamo salvare un elenco dei moduli in un file di testo(per convenzione, chiamiamo questo file "requirements.txt") tramite il comando pip freeze:

>>> pip freeze > requirements.txt

A questo punto possiamo disattivare il nostro virtualenv col comando:

>>> deactivate

Cancellare l'Ambiente Virtuale:

>>> rm -r v_env_x1

E quindi simulare questo passaggio del nostro progetto a un altro sviluppatore, che dovrà quindi crearsi a sua volta un ambiente. Creiamo un nuovo ambiente virtuale e installiamo le dipendenze necessarie per far funzionare "test_alpha":

>>> python -m venv v_env_newenv
>>> source  v_env_newenv/bin/activate
>>> pip list
>>> pip install -r requirements.txt
>>> pip list
>>> python test_alpha/manage.py runserver

Ed ecco che tutto funziona, di nuovo, a meraviglia!

Menu della Serie