Pip (da pip installs packages) è il principale gestore di pacchetti per Python. Permette di installare, aggiornare e disinstallare librerie e applicazioni Python distribuite separatamente dalla libreria standard.
Quando sviluppiamo un programma, possiamo aver bisogno di funzionalità aggiuntive, come richieste HTTP, analisi dei dati o applicazioni web. Pip consente di scaricare pacchetti dal Python Package Index (PyPI) e da altre sorgenti configurate.
Gli elementi fondamentali sono:
- PyPI: il repository pubblico che ospita pacchetti Python e relativi metadati.
- requirements.txt: un file che elenca i pacchetti da installare e, facoltativamente, i vincoli sulle versioni.
- Dipendenze: i pacchetti aggiuntivi necessari per il funzionamento di quelli richiesti; Pip cerca versioni compatibili con i vincoli dichiarati.
Il flusso di base è semplice: si esegue un comando di installazione, Pip individua i pacchetti e le dipendenze necessarie, li scarica e li installa nell'ambiente Python selezionato. A quel punto le librerie possono essere importate dal codice, se espongono moduli importabili.
Quando si usa Pip?
- Per installare librerie esterne, come
requests,numpy,flaskodjango. - Per riprodurre le dipendenze di un progetto, utilizzando un file
requirements.txt. - Insieme a
venv, per gestire ambienti virtuali isolati e ridurre i conflitti tra progetti.
Esempi pratici
Installare un pacchetto
python -m pip install requestsIl pacchetto potrà poi essere utilizzato in uno script, ad esempio con import requests.
Installare una versione specifica
python -m pip install "numpy==2.0.0"La versione indicata è solo un esempio: va scelta in base alla compatibilità con Python e con gli altri pacchetti del progetto.
Aggiornare un pacchetto
python -m pip install --upgrade requestsDisinstallare un pacchetto
python -m pip uninstall requestsElencare i pacchetti installati
python -m pip listUsare requirements.txt
Un file requirements.txt può contenere, per esempio:
requests==2.32.3
flask>=3.0,<4
numpy>=2.0,<3Questi vincoli sono illustrativi e devono essere verificati rispetto all'ambiente utilizzato. Per installare i pacchetti elencati:
python -m pip install -r requirements.txtCreare un ambiente virtuale
Su Linux e macOS:
python3 -m venv mioambiente
source mioambiente/bin/activate
python -m pip install requestsSu Windows (Prompt dei comandi):
py -m venv mioambiente
mioambiente\Scripts\activate.bat
python -m pip install requestsPer uscire dall'ambiente virtuale:
deactivateVerificare la versione di Pip
python -m pip --versionConsigli rapidi
- Usa ambienti virtuali: separano le dipendenze dei progetti dall'installazione Python di sistema. Su Debian e distribuzioni simili è particolarmente importante evitare installazioni globali non necessarie.
- Definisci i vincoli di versione: per progetti riproducibili puoi fissare versioni esatte, preferibilmente dopo averle testate.
- Controlla i pacchetti installati:
pip freezeelenca i pacchetti dell'ambiente nel formato utilizzabile da un file dei requisiti.
python -m pip freeze > requirements.txtIl comando registra i pacchetti installati nell'ambiente corrente, comprese le dipendenze indirette: è utile per documentare un ambiente, ma non sostituisce sempre una gestione ragionata delle dipendenze dirette.
Risoluzione dei conflitti di dipendenza
Che cosa sono i conflitti? Si verificano quando due o più pacchetti impongono vincoli incompatibili sulla versione di una stessa dipendenza. Ad esempio:
- Il pacchetto A richiede
requests>=2.25,<2.27. - Il pacchetto B richiede
requests>=2.28.
Non esiste una versione di requests che soddisfi contemporaneamente entrambi i vincoli. Pip deve quindi trovare altre versioni compatibili dei pacchetti coinvolti oppure segnalare che non può risolvere l'installazione.
Come Pip risolve i conflitti
A partire da Pip 20.3 è stato adottato un nuovo risolutore delle dipendenze, basato anche sul backtracking: Pip può esaminare diverse combinazioni di versioni per cercare una soluzione coerente. Quando non ne trova una, restituisce un errore che aiuta a individuare i vincoli incompatibili.
Un esempio semplificato di messaggio è:
ERROR: Cannot install package_a==1.0 and package_b==2.0
because these package versions have conflicting dependencies.
The conflict is caused by:
package_a 1.0 depends on requests<2.27,>=2.25
package_b 2.0 depends on requests>=2.28Strategie per evitare o gestire i conflitti
- Usa ambienti virtuali separati. Ogni progetto mantiene le proprie dipendenze, limitando le interferenze con altri progetti.
- Rivedi i vincoli in
requirements.txt. Cerca combinazioni di versioni effettivamente compatibili; fissare versioni incompatibili non risolve il problema. - Controlla l'ambiente con
pip check. Il comando verifica le dipendenze dei pacchetti già installati e segnala eventuali incompatibilità. - Mantieni Pip aggiornato nell'ambiente appropriato. Le versioni recenti possono offrire miglioramenti e correzioni.
- Valuta strumenti alternativi. Poetry offre gestione del progetto e file di lock; Conda gestisce anche dipendenze non Python.
- Evita di forzare le installazioni. Opzioni come
--no-depse--ignore-installedpossono lasciare un ambiente incoerente se utilizzate senza comprenderne gli effetti.
Per controllare le dipendenze:
python -m pip checkPer aggiornare Pip all'interno di un ambiente virtuale:
python -m pip install --upgrade pipCaso pratico
Immaginiamo un progetto che utilizzi numpy e tensorflow. Alcune combinazioni di versioni possono richiedere intervalli incompatibili di librerie condivise, come protobuf. Se un pacchetto richiede una versione inferiore a un determinato limite e un altro ne richiede una superiore, Pip può segnalare il conflitto. La soluzione consiste nel verificare quali versioni dei pacchetti principali siano compatibili oppure nel separare i progetti in ambienti virtuali diversi.