18. Ambienti Virtuali in Python con venv

Durante questo corso abbiamo imparato a usare varie funzioni integrate di Python e a importare i moduli della Standard Library. In questa lezione vedremo come sia possibile installare moduli esterni creati da altri developer, sia su Windows che su Linux o Mac OS, e nel fare ciò parleremo di ambienti virtuali e PIP.


Il Python Package Index

Il Python Package Index è un deposito di software scritto per Python.

Si tratta di una risorsa molto importante perché contiene al suo interno centinaia di migliaia di progetti scritti da varie organizzazioni o singoli developer, e non parlo solo di semplici progetti sviluppati in un fine settimana ma di librerie complesse e strutturate utilizzate da migliaia di aziende e altre attività, nel mondo reale. Da questo repository è possibile scaricare queste librerie gratuitamente e iniziare a creare software anche molto avanzato, senza dover reinventare la ruota.


Il comando pip list

I moduli del Python Package Index vengono installati da terminale, tramite un programma chiamato PIP, che dovreste già avere nel vostro computer in quanto è presente, tipicamente, nel pacchetto di installazione di Python. I vari moduli possono essere installati in due aree: a livello di sistema o in un ambiente virtuale.

Partiamo dall'analisi di quanto presente a livello di sistema: aprite quindi un terminale e date il comando pip list.

Nota: su sistemi Linux e Mac OS capita spesso di avere due versioni di Python installate (2.X e 3.X) e per questo motivo, a seconda della vostra personale configurazione potreste dover usare il comando pip3 invece di pip per installare moduli utilizzabili con Python 3.

pip list

Se il comando ha funzionato a dovere, dovreste ora vedere un elenco di pacchetti installati a livello di sistema come ad esempio:

pip list

# output

Package                 Version
----------------------- -------------
pip                     22.0.4
setuptools              58.1.0

Attenzione: qualora non otteniate alcun elenco, potreste invece dover installare pip.

Su Windows la procedura più immediata prevede tipicamente la reinstallazione di Python secondo quanto mostrato nella prima lezione. Nello specifico, fate attenzione alle varie spunte che selezionate!

Su Linux o WSL, il terminale dovrebbe restituirvi il comando opportuno da dare per installer pip a seconda del vostro sistema operativo. I comandi sono tipicamente i seguenti:

# comando tipico su Ubuntu e derivate
sudo apt install python3-pip

# comando tipico su Arch e derivate
sudo pacman -S python-pip

Installare package a livello di sistema è sconsigliato per vari motivi: uno di questi è il fatto che progetti diversi richiedono spesso versioni diverse degli stessi package e questo può causare conflitti, inoltre su alcuni sistemi sono richiesti permessi speciali per poter installare del nuovo software.

Ed è qui che entrano in gioco gli ambienti virtuali.


Cosa sono gli Ambienti Virtuali di Python?

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.

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.

Esistono vari strumenti per creare ambienti virtuali, e noi useremo uno chiamato venv che è presente di default con l'installazione di Python.


Creare Ambienti Virtuali Python su Windows, Linux e Mac OS

È importante sapere quale comando utilizzare per poter richiamare una shell di Python da terminale. Dovrete in sostanza usare lo stesso comando usato finora nel corso per eseguire gli script o per avviare una shell Python.

In generale, questo comando può essere: "python", "python3" o "py".

Oltre a questo comando, dovrete usare alcune istruzioni aggiuntive che informino Python che volete creare un ambiente virtuale, così come per eseguire uno script dobbiamo passargli il percorso che porta al file.py.

Spostatevi in una cartella dove avete permessi di scrittura (per testare va benissimo anche la cartella Documenti o Scrivania/Desktop) e date il comando:

# ricorda: usa il comando usato finora per avviare una shell / eseguire uno script: python, python3 o py

python -m venv venv

Così facendo abbiamo detto a Python (comando: python o python3 o py) che intendiamo usare il modulo venv (-m venv) per creare un ambiente virtuale in una nuova cartella chiamata venv. Avremmo potuto quindi cambiare la parte finale del comando per creare un ambiente in una cartella chiamata in qualsiasi modo.

Creare Ambienti Virtuali con Conda

Un altro sistema di gestione di pacchetti e di ambienti virtuali molto utilizzato è Conda, che rispetto a venv offre diverse funzionalità aggiuntive, come la possibilità di creare ambienti virtuali con diverse versioni di Python o una gestione delle dipendenze avanzata. Per creare un nuovo ambiente virtuale tramite Conda, su Anaconda/Miniconda Prompt digitate:

conda create --name myenv

Sostituite myenv con un nome a vostra scelta. Se necessario potete indicare quale versione di Python specifica installare alla fine del comando:

conda create --name myenv python=3.11


Come attivare un Ambiente Virtuale di Python

Per poter usare un ambiente virtuale dobbiamo anzitutto attivarlo: il comando di attivazione è leggermente diverso su Windows rispetto a Linux e Mac OS.

Dal terminale di sistema, nel percorso contenente anche la cartella appena creata, date il comando:

# su Linux e Mac OS
source ./nome_cartella_ambiente/bin/activate

# su Windows, da PowerShell
 .\nome_cartella_ambiente\Scripts\Activate.ps1 

# su Windows, da cmd
nome_cartella_ambiente\Scripts\activate

Invece per Conda date il comando:

# Windows
conda activate myenv
# Linux
source activate myenv

Tenete conto che per usare un ambiente virtuale dovrete attivarlo ogni volta che intendete installare nuovi package o eseguire uno script che utilizzi i package in esso installati.

Vi ricordo che nel video allegato a questa lezione troverete tutte le istruzioni - passo passo.

Saprete che un ambiente virtuale è stato attivato correttamente quando vedrete la scritta (venv) all'inizio dell'output del vostro terminale.

Windows e l'errore relativo all'attivazione degli ambienti virtuali

Su Windows potrebbe capitarvi di ricevere un errore relativo all'esecuzione di Script sul sistema. Ci sono diverse soluzioni al riguardo, e tutte prevedono l'esecuzione di un comando specifico per dire a Windows che intendete eseguire comunque questo script.

Vi lascio questo link dove vengono vagliate diverse opzioni, potendo scegliere tra queste una che più si addica alle vostre esigenze.


Come usare gli Ambienti Virtuali

A questo punto, se l'ambiente virtuale è stato attivato correttamente, dovreste essere pronti ad installarci dei nuovi package! Per fare ciò useremo pip.

Provate anzitutto a verificare che tutto funzioni correttamente dando nuovamente il comando pip list, dovreste ottenere un output di questo tipo:

(venv) utente@sistema:~/Desktop$ pip list
Package    Version
---------- -------
pip        22.0.2
setuptools 59.6.0


Come installare i package in un Ambiente Virtuale

Siamo ora pronti finalmente per installare dei package nel nostro sistema!

Per installare Django, uno dei web framework Python più utilizzati di cui parlo anche nei miei corsi completi, date il comando:

pip install django

Volendo potete ora ridare il comando pip list, che dovrebbe mostrarvi stavolta tra i package installati, anche Django ed alcuni altri package.

pip list

# output
Package    Version
---------- -------
asgiref    3.5.2
Django     4.0.5
pip        22.0.2
setuptools 59.6.0
sqlparse   0.4.2
tzdata     2022.1

Ora che il package Django è stato installato, possiamo finalmente utilizzarlo, e potremo accederci da una shell interattiva interna all'ambiente virtuale, in maniera analoga a quanto facciamo con i moduli della Standard Library.

Ad ambiente attivo, avviate quindi una shell interattiva col comando python, e date i seguenti comandi che dovrebbero darvi un output simile a quello qui mostrato:

>>> import django
>>> django.VERSION

# output
(4, 0, 5, 'final', 0)


Come installare una versione specifica di un package Python

Potrà capitarvi di dover installare una versione specifica di un package, magari per questioni di compatibilità con altri elementi software utilizzati nello stesso progetto.

Utilizzando il comando visto sopra verrà però installata l'ultima versione disponibile.

Come fare per installare una versione specifica di un package in Python?

Supponiamo di voler installare la versione 0.25.1 di pandas.

Possiamo fare:

pip install pandas==0.25.1

E se ora diamo il comando pip list, ecco che notiamo come la versione effettivamente installata sia la 0.25.1, ovvero la versione specifica del package di cui abbiamo bisogno.

Tuttavia è molto importante precisare che sarà possibile installare solamente versioni di package compatibili con la versione di Python utilizzata per creare l'ambiente virtuale!

Ad esempio, nel nostro caso, volendo usare pandas 0.25.1 non sarà possibile usare versioni di Python recenti come la 3.12.

In tal caso potete sempre installare una versione compatibile di Python tramite il py launcher su Windows, oppure pyenv su Linux e Mac OS.


Come disattivare un Ambiente Virtuale

Cosi come vengono attivati, gli ambienti virtuali possono essere anche disattivati, ad esempio per riaccedere all'ambiente di sistema discusso in precedenza.

Per fare ciò è sufficiente dare il comando:

deactivate

A questo punto, la scritta (venv) dovrebbe essere sparita dall'output.

Nota: l'ambiente virtuale verrà inoltre disattivato alla chiusura del terminale di sistema, e dovrete quindi riattivarlo ogni volta.


Windows Subsystem for Linux (Python da WSL)

Potrebbe capitare per varie ragioni di avere la necessità di sviluppare un software su Linux anche se si utilizza Windows, soprattutto in caso si debba testare la compatibilità di un programma progettato per essere multi-piattaforma o per poter utilizzare librerie di terze parti che non supportano Windows.

Se state usando una versione di Windows uguale o superiore a 10 potete installare nel vostro computer una o più distribuzioni Linux a vostra scelta senza dover utilizzare necessariamente una macchina virtuale: installate la funzionalità Windows Subsystem for Linux (WSL) con PowerShell o con il prompt dei comandi di Windows digitando il seguente comando come amministratori:

wsl --install

Questo comando abiliterà le funzionalità necessarie per eseguire WSL e installare la distribuzione Ubuntu di Linux, che potrete poi utilizzare direttamente dal menù di PowerShell e sul terminale di Visual Studio Code.

Per ulteriori dettagli sull’installazione di WSL potete seguire la guida ufficiale di Microsoft.

La procedura per l'uso di Python e venv sotto WSL è la stessa di Linux, e potete quindi usare i comandi relativi mostrati sopra.


Errori Comuni e Come Risolverli

Precisiamo che anzitutto, è fondamentale che leggiate sempre nel dettaglio i messaggi di errore che vi vengono mostrati, perché molte più volte che non, questi conterranno al loro interno anche i comandi necessari a poterli risolvere.

Tipicamente potreste ricevere dei messaggi di errore in queste situazioni:

  • Problema provando ad utilizzare pip. In questo caso, potreste dover installare pip nel sistema. Come precisato sopra, su Windows potrebbe risultare più comodo re installare Python da zero seguendo la procedura mostrata nella prima lezione, mentre su Linux dovreste poter risolvere con l'installazione di un package extra da riga di comando
  • Problema in fase di creazione col comando "python -m venv nome_ambiente". Questo errore è più comune su Linux che su Windows. Anche in questo caso la soluzione passa per l'installazione di un package extra e dovreste ottenere il comando preciso per il vostro sistema direttamente dal messaggio d'errore stesso. Di norma il comando, su distro Ubuntu e derivate (WSL incluso) è "sudo apt install python3-venv".