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 ipaddress
Code 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>==versione
Code 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 Series | Latest Release | End of mainstream support | End of extended support |
---|---|---|---|
5.0 | 5.0.6 | August 2024 | April 2025 |
4.2 LTS | 4.2.13 | December 4, 2023 | April 2026 |
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.txt
Code 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.txt
Code 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.txt
Code 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)