12. Virtual environment e package¶
12.1. Introduzione¶
I programmi Python usano spesso moduli e package che non sono compresi nella libreria standard. Inoltre le applicazioni talvolta hanno bisogno di una specifica versione di una libreria, perché è necessario che un certo baco sia stato risolto, oppure perché fanno uso di una vecchia versione dell’interfaccia della libreria.
Ciò vuol dire che non è possibile che una singola installazione di Python possa venire incontro alle esigenze di ogni possibile applicazione. Se il programma A richiede la versione 1.0 di un certo modulo, ma il programma B ha bisogno della 2.0, queste necessità sono in conflitto e installare una delle due versioni non permetterà all’altro programma di funzionare correttamente.
La soluzione è creare un virtual environment, ovvero una directory auto-sufficiente che contiene una installazione di Python, per una particolare versione di Python, oltre a un certo numero di pacchetti aggiuntivi.
Programmi diversi possono usare virtual environment diversi. Per risolvere il problema di richieste in conflitto dell’esempio precedente, il programma A può avere il suo environment con la versione 1.0 installate, mentre il programma B avrà un altro virtual environment con la versione 2.0. Se in seguito B richiede un aggiornamento della libreria alla versione 3.0, ciò non avrà conseguenze sull’environment di A.
12.2. Creare un virtual environment¶
venv
è il modulo usato per creare e gestire virtual environment.
venv
installa la versione di Python da cui il comando
è stato eseguito (verificabile con l’opzione --version
).
Per esempio, eseguendo il comando con python3.12
, installerà Python 3.12.
Per creare un virtual environment, decidete in quale directory volete
collocarlo e avviate il modulo venv
come uno script, passando il
percorso della directory scelta:
python -m venv tutorial-env
Questo crea la directory tutorial-env
se non esiste; inoltre crea al suo
interno le directory che contengono una copia dell’interprete Python
e diversi file di corredo.
Un luogo comune per conservare i virtual environment è .venv
: questo nome
mantiene la directory nascosta nella shell in modo che non sia d’impiccio, e
al contempo dice chiaramente a che cosa serve la directory. Inoltre evita
conflitti con i file .env
di definizione delle variabili d’ambiente, che
qualche tool supporta.
Creato il virtual environment, non resta che attivarlo.
Su Windows invocate:
tutorial-env\Scripts\activate
Su Unix o MacOS:
source tutorial-env/bin/activate
(Lo script è scritto per la bash shell. Se usate csh o
fish, usate invece gli script alternativi activate.csh
o
activate.fish
.)
Attivare il virtual environment cambia il prompt della shell per mostrare il
nome dell’environment in uso; modifica inoltre l’ambiente di lavoro in modo
che invocare python
restituisca quella particolare versione e
installazione dell’interprete. 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 virtual environment, inserite
deactivate
nel vostro terminale.
12.3. Gestire i pacchetti con Pip¶
Potete installare, aggiornare, rimuovere package usando un programma chiamato
pip. Per default pip
installerà pacchetti pubblicati sul
Python Package Index. Potete cercare nel PyPI con il
vostro browser.
pip
offre un numero di comandi interni: «install», «uninstall»,
«freeze», etc. (Si veda la guida a
Installare moduli Python per la documentazione
completa di pip
.)
Per installare l’ultima versione disponibile di un package, basta specificare il suo nome:
(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
Potete anche installare una versione specifica, indicando il nome seguito da
==
e il 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 eseguite due volte questo comando, pip
vi informerà che la versione
richiesta è già presente e non farà nient’altro. Potete indicare un altro
numero di versione per ottenere quella, oppure 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 dal nome di uno o più pacchetti,
li rimuoverà dal virtual environment.
python -m pip show
visualizza 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
elenca tutti i pacchetti installati
in un virtual environment:
(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
produce una lista simile di pacchetti installati,
ma usa un formato che può essere letto da python -m pip install
.
Una convenzione molto usata è di collocare 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 file requirements.txt
può essere incluso nel controllo di versione e
distribuito come parte dell’applicazione. Gli utenti possono poi usarlo per
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. Consultate la guida a Installare moduli
Python per la documentazione completa di pip
. Se avete
scritto un package Python e volete pubblicarlo sul Python Package Index,
leggete la :ref:`Python packaging user guide`_.