Se segui questo blog saprai che da qualche mese sto studiando Python. Quest’anno di conseguenza scriverò qualche piccola guida per ricordarmi le nozioni che apprendo, ma questi contenuti saranno solo una breve parentesi nel mondo SEO, che continuerò a trattare con focus principale.
Un ambiente virtuale in Python è uno strumento che aiuta a mantenere separate le dipendenze richieste da diversi progetti creando per loro ambienti virtuali isolati. Questo è uno degli strumenti più importanti utilizzati dalla maggior parte degli sviluppatori Python.
Perché abbiamo bisogno di un ambiente virtuale?
Le applicazioni sviluppate con Python useranno spesso pacchetti e moduli che non fanno parte della libreria standard. A volte le applicazioni necessitano di una versione specifica di una libreria, poiché l’applicazione potrebbe richiedere la correzione di un determinato bug o l’applicazione potrebbe essere scritta utilizzando una versione obsoleta dell’interfaccia della libreria.
Ciò significa che potrebbe non essere possibile per un’installazione Python soddisfare i requisiti di ogni applicazione. Se l’applicazione A richiede la versione 1.0 di un particolare modulo ma l’applicazione B richiede la versione 2.0, i requisiti sono in conflitto e l’installazione della versione 1.0 o 2.0 non consente l’esecuzione di un’applicazione.
La soluzione a questo problema è quella di creare un ambiente virtuale, un albero di directory autonomo che contiene un’installazione Python per una particolare versione di Python, oltre a una serie di pacchetti aggiuntivi.
Applicazioni diverse possono quindi utilizzare ambienti virtuali diversi. Per risolvere il precedente esempio di requisiti in conflitto, l’applicazione A può avere un proprio ambiente virtuale con la versione 1.0 installata mentre l’applicazione B ha un altro ambiente virtuale con la versione 2.0. Se l’applicazione B richiede l’aggiornamento di una libreria alla versione 3.0, ciò non influirà sull’ambiente dell’applicazione A.
Immagina uno scenario in cui stai lavorando a due progetti Python basati sul web e uno di essi utilizza un Django 1.9 e l’altro utilizza Django 1.10 e così via. In tali situazioni, l’ambiente virtuale può essere davvero utile per mantenere le dipendenze di entrambi i progetti.
Quando e dove utilizzare un ambiente virtuale?
Per impostazione predefinita, ogni progetto sul sistema utilizzerà le stesse directory per archiviare e recuperare i pacchetti del sito (librerie di terze parti).
Che importanza ha? Ora, nell’esempio sopra di due progetti, hai due versioni di Django. Questo è un vero problema per Python poiché non è in grado di distinguere tra le versioni nella directory “site-packages”. Quindi sia v1.9 che v1.10 risiederebbero nella stessa directory con lo stesso nome. È qui che entrano in gioco gli ambienti virtuali. Per risolvere questo problema, dobbiamo solo creare due ambienti virtuali separati per entrambi i progetti. Il bello di questo è che non ci sono limiti al numero di ambienti che puoi avere poiché sono solo directory che contengono alcuni script.
L’ambiente virtuale dovrebbe essere usato ogni volta che lavori su qualsiasi progetto basato su Python. È generalmente buono avere un nuovo ambiente virtuale per ogni progetto basato su Python su cui lavori. Quindi le dipendenze di ogni progetto sono isolate dal sistema e dall’altra.
Come si creano ambienti virtuali?
Usiamo un modulo chiamato venv che è uno strumento per creare ambienti Python isolati. Venv crea una cartella che contiene tutti gli eseguibili necessari per usare i pacchetti di cui un progetto Python avrebbe bisogno.
Come gestire un ambiente virtuale
Il modulo utilizzato per creare e gestire ambienti virtuali si chiama venv.
venv di solito installa la versione più recente di Python che hai a disposizione. Se hai più versioni di Python sul tuo sistema, puoi selezionare una versione specifica di Python eseguendo python3 o qualunque versione desideri.
Per creare un ambiente virtuale con venv, entra nella cartella che lo deve contenere e digita:
python3 -m venv env1
Il comando appena visto crea un virtual environment denominato “env1” che contiene una struttura di file e cartelle simile a questa:
├── bin
│ ├── activate
│ ├── activate.csh
│ ├── activate.fish
│ ├── easy_install
│ ├── easy_install-3.5
│ ├── pip
│ ├── pip3
│ ├── pip3.5
│ ├── python -> python3.5
│ ├── python3 -> python3.5
│ └── python3.5 -> /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5
├── include
├── lib
│ └── python3.5
│ └── site-packages
└── pyvenv.cfg
Ecco cosa contiene ogni cartella:
- bin: file che interagiscono con l’ambiente virtuale
- include: intestazioni C che compilano i pacchetti Python
- lib: una copia della versione di Python insieme a una cartella dei pacchetti del sito in cui è installata ciascuna dipendenza
Dopo averlo creato devi attivare l’ambiente virtuale:
source env/bin/activate
Mentre per disattivarlo digita:
deactivate
Per visualizzare l’ambiente virtuale attivo digita:
which python
Per visualizzare tutti i pacchetti installati ed esportare un file elenco, naviga nella cartella del virtual env e digita (se vuoi vedere pacchetti venv attiva venv):
pip3 freeze > requirements.txt
Per copiare un ambiente virtuale venv sposta il file requirements.txt nella nuova cartella e digita:
pip3 install -r requirements.txt.
Per rimuovere completamente un virtual environment digita:
rm -r venv/
Non esiste solo VENV
Python 3.3 include nella sua libreria standard il nuovo pacchetto venv. Cosa fa e in cosa differisce da tutti gli altri pacchetti per la gestione degli ambienti virtuali? Vediamo le principali differenze.
Pacchetti PyPI non presenti nella libreria standard
- virtualenv è uno strumento molto popolare che crea ambienti Python isolati per le librerie Python. Se non hai familiarità con questo strumento, ti consiglio vivamente di impararlo, in quanto è uno strumento molto utile e farò un confronto con esso per il resto di questa risposta. Funziona installando un gruppo di file in una directory (ad esempio: env/), e quindi modificando la variabile di ambiente PATH per aggiungerla al prefisso con una directory bin personalizzata (ad esempio: env/bin/). Una copia esatta del binario python o python3 è collocata in questa directory, ma Python è programmato per cercare prima le librerie relative al suo percorso, nella directory environment. Non fa parte della libreria standard di Python, ma è ufficialmente accettato dal PyPA (Python Packaging Authority). Una volta attivato, è possibile installare i pacchetti nell’ambiente virtuale usando pip.
- pyenv è usato per isolare le versioni di Python. Ad esempio, potresti voler testare il tuo codice con Python 2.6, 2.7, 3.3, 3.4 e 3.5, quindi avrai bisogno di un modo per passare da un ambiente all’altro. Una volta attivato, prefigura la variabile d’ambiente PATH con ~/.pyenv/shims, dove ci sono file speciali corrispondenti ai comandi Python (python, pip). Queste non sono copie dei comandi forniti da Python; sono script speciali che decidono al volo quale versione di Python eseguire in base alla variabile di ambiente PYENV_VERSION, al file .python-version o al file ~/.pyenv/version. pyenv inoltre semplifica il processo di download e installazione di più versioni di Python, utilizzando il comando pyenv install.
- pyenv-virtualenv è un plugin per pyenv dello stesso autore di pyenv, per permetterti di usare comodamente pyenv e virtualenv allo stesso tempo. Tuttavia, se si utilizza Python 3.3 o versioni successive, pyenv-virtualenv tenterà di eseguire python -m venv se disponibile, anziché virtualenv.
- virtualenvwrapper è un insieme di estensioni di virtualenv. Ti dà comandi come mkvirtualenv, lssitepackages, risulta utile per passare da una directory virtuale all’altra.
- pyenv-virtualenvwrapper è un plugin per pyenv dello stesso autore di pyenv, per integrare comodamente virtualenvwrapper in pyenv.
- pipenv, di Kenneth Reitz, è il progetto più recente in questo elenco. Mira a combinare Pipfile, pip e virtualenv in un comando unico. La directory virtualenv viene in genere collocata in ~/.local/share/virtualenvs/XXX, con XXX come hash del percorso della directory del progetto. Questo aspetto differisce da virtualenv, in cui la directory si trova in genere nella directory di lavoro corrente.
La Guida al packaging di Python raccomanda pipenv durante lo sviluppo di applicazioni Python (al contrario delle librerie). Non sembra esserci alcun piano per supportare venv invece di virtualenv. Un aspetto che crea confusione è che la sua opzione da riga di comando –venv si riferisce alla directory virtualenv, non a venv, e allo stesso modo, la variabile d’ambiente PIPENV_VENV_IN_PROJECT influenza la posizione della directory virtualenv, non la directory venv.
Biblioteca standard
- pyvenv è uno script fornito con Python 3 ma deprecato in Python 3.6 poiché aveva problemi. In Python 3.6+, l’equivalente esatto è python3 -m venv.
- venv è un pacchetto fornito con Python 3, che puoi eseguire usando python3 -m venv (anche se per qualche ragione alcune distro lo separano in un pacchetto separato, come python3-venv su Ubuntu e Debian). Ha uno scopo simile a virtualenv e funziona bene o male nello stesso modo, ma non ha bisogno di copiare i binari di Python (tranne che su Windows). Usalo se non hai bisogno di supportare Python 2. Al momento in cui scrivo, la community di Python sembra essere felice con virtualenv e non ho sentito molto parlare di venv.
La maggior parte di questi strumenti si completano a vicenda. Ad esempio, pipenv integra pip, virtualenv e persino pyenv, se lo si desidera. Gli unici strumenti che sono vere alternative tra loro qui sono venv e virtualenv.
Raccomandazione per i principianti
Questa è la mia raccomandazione personale per i principianti: inizia imparando venv o virtualenv e pip, strumenti che funzionano con Python 2 e 3 e in una varietà di situazioni, e passa agli altri strumenti quando inizi a averne bisogno.
Lascia un commento