20. Ambienti Virtuali in Python con VENV - Programmare in Python

20. Ambienti Virtuali in Python con VENV


Cosa sono e a cosa servono gli Ambienti Virtuali?

Gli Ambienti Virtuali o Virtual Environments di Python sono uno strumento che 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.


Come si creano gli Ambienti Virtuali?


Anzitutto, è importante precisare che per creare un ambiente virtuale 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 ci 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)

Tipicamente chiamiamo l'ambiente virtuale env o venv: io utilizzo qui un nome più esplicito per rendere l'idea di un ambiente specifico per ogni progetto!

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!

Per verificare quale Ambiente Virtuale sia attivo nel nostro sistema ci basta ora dare il comando:

which python

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

Possiamo quindi effettuare qualche installazione tramite pip.

Supponiamo ad esempio, di voler utilizzare l'ambiente appena creato per testare una versione specifica di una dipendenza, come ad esempio 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


Come gestire un Ambiente Virtuale?


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 che per convenzione, chiamiamo "requirements.txt", tramite il comando pip freeze:

pip freeze > requirements.txt

Per disattivare l'ambiente virtuale possiamo usare il comando:

deactivate

E per cancellarlo definitivamente dal sistema possiamo trattarlo come qualsiasi altra cartella:

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!


Come creare un Ambiente Virtuale con una versione diversa di Python?

Supponiamo che tu stia utilizzando l'ultima versione dell'interprete Python ma abbia bisogno di creare un ambiente virtuale utilizzando una versione precedente per via di un problema di compatibilità: come fare ciò?

La risposta è semplice: usa PYENV!

Si tratta di uno strumento che permette di creare ambienti virtuali usando qualsiasi versione di Python tu possa ritenere opportuna.

Ho creato una video lezione dedicata al riguardo chiamata PYENV: Installazioni Multiple di Python su Linux e MacOS

Happy Coding!