Salta al contenuto principale

Pip: il gestore di pacchetti Python – cos’è, come funziona e come usarlo

Inviato da tuxsa il
pip

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, flask o django.
  • 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 requests

Il 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 requests

Disinstallare un pacchetto

python -m pip uninstall requests

Elencare i pacchetti installati

python -m pip list

Usare requirements.txt

Un file requirements.txt può contenere, per esempio:

requests==2.32.3
flask>=3.0,<4
numpy>=2.0,<3

Questi vincoli sono illustrativi e devono essere verificati rispetto all'ambiente utilizzato. Per installare i pacchetti elencati:

python -m pip install -r requirements.txt

Creare un ambiente virtuale

Su Linux e macOS:

python3 -m venv mioambiente
source mioambiente/bin/activate
python -m pip install requests

Su Windows (Prompt dei comandi):

py -m venv mioambiente
mioambiente\Scripts\activate.bat
python -m pip install requests

Per uscire dall'ambiente virtuale:

deactivate

Verificare la versione di Pip

python -m pip --version

Consigli 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 freeze elenca i pacchetti dell'ambiente nel formato utilizzabile da un file dei requisiti.
python -m pip freeze > requirements.txt

Il 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.28

Strategie per evitare o gestire i conflitti

  1. Usa ambienti virtuali separati. Ogni progetto mantiene le proprie dipendenze, limitando le interferenze con altri progetti.
  2. Rivedi i vincoli in requirements.txt. Cerca combinazioni di versioni effettivamente compatibili; fissare versioni incompatibili non risolve il problema.
  3. Controlla l'ambiente con pip check. Il comando verifica le dipendenze dei pacchetti già installati e segnala eventuali incompatibilità.
  4. Mantieni Pip aggiornato nell'ambiente appropriato. Le versioni recenti possono offrire miglioramenti e correzioni.
  5. Valuta strumenti alternativi. Poetry offre gestione del progetto e file di lock; Conda gestisce anche dipendenze non Python.
  6. Evita di forzare le installazioni. Opzioni come --no-deps e --ignore-installed possono lasciare un ambiente incoerente se utilizzate senza comprenderne gli effetti.

Per controllare le dipendenze:

python -m pip check

Per aggiornare Pip all'interno di un ambiente virtuale:

python -m pip install --upgrade pip

Caso 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.