12. Ambienti Virtuali e Pacchetti

12.1. Introduzione

Le applicazioni Python spesso utilizzano pacchetti e moduli che non fanno parte della libreria standard. Le applicazioni a volte necessitano una versione specifica di una libreria, perché l’applicazione potrebbe richiedere che un bug particolare sia stato risolto o l’applicazione potrebbe essere stata scritta utilizzando una versione obsoleta dell’interfaccia della libreria.

Questo significa che potrebbe non essere possibile per una singola installazione di Python soddisfare i requisiti di ogni applicazione. Se l’applicazione A necessita della versione 1.0 di un particolare modulo ma l’applicazione B necessita della versione 2.0, allora i requisiti sono in conflitto e l’installazione della versione 1.0 o 2.0 lascerà una delle applicazioni impossibilitata a funzionare.

La soluzione a questo problema è creare un virtual environment, un albero di directory auto-contenuto che contiene un’installazione di Python per una particolare versione di Python, più un numero di pacchetti aggiuntivi.

Differenti applicazioni possono quindi utilizzare differenti ambienti virtuali. Per risolvere l’esempio precedente di requisiti in conflitto, l’applicazione A può avere il suo 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 che una libreria venga aggiornata alla versione 3.0, questo non influenzerà l’ambiente dell’applicazione A.

12.2. Creazione di Ambienti Virtuali

Il modulo utilizzato per creare e gestire ambienti virtuali si chiama venv. venv installerà la versione di Python dalla quale il comando è stato eseguito (come riportato dall’opzione --version). Per esempio, eseguendo il comando con python3.12 verrà installata la versione 3.12.

Per creare un ambiente virtuale, decidi una directory dove vuoi posizionarlo ed esegui il modulo venv come script con il percorso della directory:

python -m venv tutorial-env

Questo creerà la directory tutorial-env se non esiste, e creerà anche directory all’interno contenenti una copia dell’interprete Python e vari file di supporto.

Una posizione comune per una directory di ambiente virtuale è .venv. Questo nome mantiene la directory generalmente nascosta nella tua shell e quindi fuori mano, dando anche un nome che spiega il motivo dell’esistenza della directory. Previene anche conflitti con file di definizione di variabili d’ambiente .env che alcuni strumenti supportano.

Una volta creato un ambiente virtuale, puoi attivarlo.

Su Windows, esegui:

tutorial-env\Scripts\activate

Su Unix o MacOS, esegui:

source tutorial-env/bin/activate

(Questo script è scritto per la shell bash. Se utilizzi le shell csh o fish, ci sono script alternativi activate.csh e activate.fish che dovresti utilizzare.)

Attivare l’ambiente virtuale cambierà il prompt della tua shell per mostrare quale ambiente virtuale stai utilizzando, e modificherà l’ambiente in modo che eseguire python ti fornirà quella versione e installazione particolare di Python. Per esempio:

$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May  6 2016, 10:59:36)
  ...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>

Per disattivare un ambiente virtuale, scrivi:

deactivate

nel terminale.

12.3. Gestione dei Pacchetti con pip

Puoi installare, aggiornare e rimuovere pacchetti utilizzando un programma chiamato pip. Per impostazione predefinita pip installerà pacchetti dal Python Package Index. Puoi sfogliare il Python Package Index andando sul sito web con il tuo browser.

pip ha un certo numero di sottocomandi: «install», «uninstall», «freeze», etc. (Consulta la guida Installing Python Modules per la documentazione completa su pip.)

Puoi installare l’ultima versione di un pacchetto specificando il nome del pacchetto:

(tutorial-env) $ python -m pip install novas
Collecting novas
  Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
  Running setup.py install for novas
Successfully installed novas-3.1.1.3

Puoi anche installare una versione specifica di un pacchetto fornendo il nome del pacchetto seguito da == e dal numero di versione:

(tutorial-env) $ python -m pip install requests==2.6.0
Collecting requests==2.6.0
  Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0

Se esegui nuovamente questo comando, pip noterà che la versione richiesta è già installata e non farà nulla. Puoi fornire un numero di versione diverso per ottenere quella versione, oppure puoi eseguire python -m pip install --upgrade per aggiornare il pacchetto all’ultima versione:

(tutorial-env) $ python -m pip install --upgrade requests
Collecting requests
Installing collected packages: requests
  Found existing installation: requests 2.6.0
    Uninstalling requests-2.6.0:
      Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0

python -m pip uninstall seguito da uno o più nomi di pacchetti rimuoverà i pacchetti dall’ambiente virtuale.

python -m pip show mostrerà informazioni su un particolare pacchetto:

(tutorial-env) $ python -m pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:

python -m pip list mostrerà tutti i pacchetti installati nell’ambiente virtuale:

(tutorial-env) $ python -m pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)

python -m pip freeze produrrà una lista simile dei pacchetti installati, ma l’output utilizza il formato che python -m pip install si aspetta. Una convenzione comune è mettere questa lista in un file requirements.txt:

(tutorial-env) $ python -m pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0

Il requirements.txt può poi essere committato nel controllo di versione e distribuito come parte di un’applicazione. Gli utenti possono poi installare tutti i pacchetti necessari con install -r:

(tutorial-env) $ python -m pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
  ...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
  ...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
  ...
Installing collected packages: novas, numpy, requests
  Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0

pip ha molte altre opzioni. Consulta la guida Installing Python Modules per la documentazione completa su pip. Quando hai scritto un pacchetto e vuoi renderlo disponibile su Python Package Index, consulta la guida dell’utente al packaging di Python.