pip install qualcosa

pip è il package manager maggiormente utilizzato nell’ambiente Python e consente di scaricare ed installare pacchetti prelevandoli dall’archivio pypi, che sta per Python Package Index.

Se è vero che molto spesso, quando si deve installare un certo pacchetto, la versione desiderata è quella più recente ed aggiornata, a volte può essere necessario installare una versione specifica o comunque una versione diversa dall’ultima disponibile.

Il motivo può essere dovuto alla compatibilità con altri pacchetti o moduli, che magari supportano solo certe versioni, oppure al fatto che per un certo pacchetto ci sono più versioni differenti ma tutte attivamente supportate e sviluppate.

Vediamo qualche esempio.

Installare l’ultima versione di un pacchetto

Per installare l’ultima versione disponibile di un certo pacchetto Python da pypi è sufficiente digitare il comando pip install <nome_pacchetto> come nell’esempio seguente:

pip install ipaddressCode language: Bash (bash)

Tale comando produce il seguente output:

Collecting ipaddress
  Downloading ipaddress-1.0.23-py2.py3-none-any.whl.metadata (923 bytes)
Downloading ipaddress-1.0.23-py2.py3-none-any.whl (18 kB)
Installing collected packages: ipaddress
Successfully installed ipaddress-1.0.23
Code language: CSS (css)

La versione 1.0.23 è infatti, al momento in cui scrivo, l’ultima disponibile per il pacchetto ipaddress.

Installare una versione specifica di un certo pacchetto

Se abbiamo la necessità di installare una specifica versione di un dato pacchetto, che non sia necessariamente l’ultima disponibile, dobbiamo indicarlo esplicitamente nel modo seguente:

pip install <nome_pacchetto>==versioneCode language: HTML, XML (xml)

In alcuni casi è necessario utilizzare le virgolette per evitare che la shell interpreti i caratteri speciali, ovvero:

pip install "<nome_pacchetto>==versione"Code language: HTML, XML (xml)

Un esempio pratico, per installare esattamente la versione 2.3.3 di Flask e non una successiva o precedente, è il seguente:

pip install "flask==2.3.3"Code language: JavaScript (javascript)

Eseguendo il comando pip list --outdated nel nostro ambiente, vedremo il seguente risultato:

Package    Version Latest Type
---------- ------- ------ -----
Flask      2.3.3   3.0.3  wheel
setuptools 59.6.0  70.0.0 wheel
Code language: CSS (css)

La versione 3.0.3 è infatti la versione più recente di Flask attualmente disponibile. Perciò, se vogliamo mantenere la versione installata, dovremo avere un po’ di accortezza quando decidiamo di eseguire degli aggiornamenti.

A tal proposito, però, c’è da dire che pip ha un comportamento diverso rispetto a quello di gem (il package manager di Ruby), che consente di aggiornare con un solo comando (gem update) tutti i pacchetti installati, portandoli all’ultima versione disponibile. Un comportamento ce l’ha anche npm, il package manager di Node.js (npm update [-g]).

Con pip invece l’upgrade di un pacchetto va richiesto esplicitamente, riducendo così il rischio di installare aggiornamenti non desiderati. Un esempio di comando di aggiornamento è il seguente:

pip install --upgrade flask

Il comando appena illustrato aggiornerà Flask all’ultima versione disponibile.

Installare la versione più recente di un dato pacchetto per una specifica major/minor release.

Veniamo ora a quello che rappresenta un po’ il “caso particolare” di tutta la faccenda: vogliamo installare l’ultima release disponibile di un certo pacchetto restando però all’interno di una major o minor version specifica. Mi spiego meglio con un esempio.

Nel momento in cui scrivo ci sono diverse versioni di Django disponibili:

Release SeriesLatest ReleaseEnd of mainstream supportEnd of extended support
5.05.0.6August 2024April 2025
4.2 LTS4.2.13December 4, 2023April 2026
Versioni Django disponibili e supportate – maggio 2024 (fonte Django Project)

In questo caso, se eseguissimo il comando pip install Django, verrebbe installata automaticamente la versione 5.0.6 del pacchetto. A noi però interessa installare l’ultima versione disponibile del branch 4.2 LTS, che al momento è la 4.2.13 ma che tra qualche settimana potrebbe essere la 4.2.14 o maggiore.

Per essere sicuri di installare quindi l’ultima release della serie 4.2 eseguiamo il seguente comando:

pip install "Django~=4.2"Code language: JavaScript (javascript)

Lo stesso comando sarà utile per aggiornare di volta in volta Django alle versioni successive, senza mai uscire dal branch 4.2 LTS.

Requirements

La stessa sintassi illustrata in precedenza può essere utilizzata all’interno del file “requirements.txt”, che si usa per tenere traccia dei pacchetti Python installati su un sistema (o in un virtual environment). Avere la lista dei pacchetti installati è utile se si deve ricreare lo stesso ambiente su un altro sistema.

Per sapere quali sono i pacchetti attualmente installati si usa il comando seguente:

pip freeze

L’output di questo comando sarà qualcosa del genere:

alembic==1.13.1
blinker==1.8.1
captcha==0.5.0
click==8.1.7
dnspython==2.6.1
email_validator==2.1.1
Flask==3.0.3
Flask-Mail==0.9.1
Flask-Migrate==4.0.7
Flask-Sessionstore==0.4.5
Flask-SQLAlchemy==3.1.1
Flask-WTF==1.2.1
flask_session_captcha==1.4.2
greenlet==3.0.3
idna==3.7
itsdangerous==2.2.0
Jinja2==3.1.3
Mako==1.3.3
MarkupSafe==2.1.5
pillow==10.3.0
PyJWT==2.8.0
python-dotenv==1.0.1
setuptools==69.5.1
SQLAlchemy==2.0.29
typing_extensions==4.11.0
Werkzeug==3.0.2
wheel==0.43.0
WTForms==3.1.2

Per salvare questa lista nel file requirements.txt si usa la redirezione dell’output, come mostrato di seguito:

pip freeze > requirements.txtCode language: CSS (css)

Disponendo di questo file, l’installazione di tutti i pacchetti in esso elencati si ottiene col comando seguente:

pip install -r requirements.txtCode language: CSS (css)

In un file del genere, quindi, sarà assolutamente lecito specificare qualcosa del tipo:

Django~=4.2

e aggiornare periodicamente i pacchetti installati con il comando:

pip install --upgrade -r requirements.txtCode language: CSS (css)

Un file requirements.txt fatto in questo modo ricorda vagamente il Gemfile che si usa per la gestione dei pacchetti nei progetti Ruby.

Ultimo aggiornamento: 24 Maggio 2024 (Gica78R)