Gli ambienti virtuali spiegati per esseri umani

Perché ogni progetto Python ha bisogno della sua sandbox, cosa fanno davvero venv/poetry/uv, e come evitare che i tuoi progetti si rompano a vicenda.

Gli ambienti virtuali spiegati per esseri umani

Hai installato un pacchetto per un progetto e adesso un progetto completamente diverso crasha. Ti suona familiare? Complimenti, hai appena scoperto perché esistono gli ambienti virtuali.

Il problema in 30 secondi

Python ha una singola cartella globale site-packages dove pip install scarica tutto. Se il Progetto A ha bisogno di pandas 1.5 e il Progetto B ha bisogno di pandas 2.1, scoppia una rissa. L’ultimo installato vince, e l’altro progetto si rompe. In silenzio, ovviamente — Python è educato così.

Un ambiente virtuale dà a ogni progetto la sua cartella site-packages isolata. Il Progetto A ha il suo pandas 1.5, il Progetto B ha il suo pandas 2.1, e non sanno nemmeno dell’esistenza l’uno dell’altro. Problema risolto.

Il metodo integrato: venv

Python include venv dalla versione 3.3. Non serve installare nulla.

# Crea un ambiente virtuale nella cartella .venv
python -m venv .venv

# Attivalo (Linux/macOS)
source .venv/bin/activate

# Attivalo (Windows)
.venv\Scripts\activate

# Ora pip install va dentro .venv, non nel Python di sistema
pip install pandas==2.1.0

Quando hai finito, deactivate per tornare al Python di sistema. La cartella .venv è una normalissima directory — cancellala e l’ambiente sparisce.

Cose che tutti dimenticano

  • Aggiungi .venv/ al .gitignore. Non si committa l’ambiente. Si committa un requirements.txt (o pyproject.toml) e lo si ricrea dove serve in fase di deploy.
  • Congela sempre le dipendenze. pip freeze > requirements.txt salva le versioni esatte che hai installato. Senza questo passaggio, pip install prende l’ultima versione e le cose possono rompersi in produzione.
  • Un ambiente per progetto. Non condividere ambienti tra progetti diversi a meno che tu non voglia rivivere esattamente il problema che stavi cercando di risolvere.

Poetry: l’opzione da grandi

venv + pip + requirements.txt funziona ma ha spigoli vivi. Poetry racchiude l’intero workflow in un unico strumento:

# Installa poetry (una volta sola)
pip install poetry

# Inizia un nuovo progetto
poetry init

# Aggiungi una dipendenza
poetry add pandas

# Installa dal lock file (versioni esatte, riproducibile)
poetry install

Poetry genera un pyproject.toml (le tue dipendenze) e un poetry.lock (versioni bloccate di ogni dipendenza, sotto-dipendenze incluse). Il lock file è quello che rende le build riproducibili — va committato.

Poetry crea e gestisce l’ambiente virtuale per te in automatico. Non devi mai attivarlo manualmente; poetry run python script.py esegue all’interno dell’ambiente.

Quando usarlo

  • Progetti con più di una manciata di dipendenze
  • Qualsiasi cosa che va in produzione o viene condivisa con un team
  • Quando sei stanco di sincronizzare manualmente il requirements.txt

uv: il ragazzino veloce

uv è uno strumento relativamente nuovo (del team Astral, gli stessi di ruff) che sostituisce pip, pip-tools, virtualenv e parti di Poetry in un singolo binario scritto in Rust. È veloce — 10–100× più rapido di pip per la risoluzione e l’installazione.

# Installa uv
pip install uv

# Crea un venv
uv venv

# Installa da requirements
uv pip install -r requirements.txt

# Oppure gestisci un progetto (workflow simile a Poetry)
uv init
uv add pandas
uv sync

uv sta ancora maturando, ma è già eccellente per:

  • Installazione rapida delle dipendenze nelle pipeline CI
  • Progetti dove vuoi un unico strumento per ambienti + pacchetti
  • Chiunque sia stufo di aspettare 30 secondi che pip risolva un albero di dipendenze

Quale scegliere?

Ti serve…Usa
Qualcosa che funziona e basta, senza installare nullavenv + pip
Build riproducibili + gestione dipendenzePoetry
Velocità sopra tutto, il bleeding edge ti va beneuv
Un notebook di data science, con il minimo sforzoconda

Se stai iniziando, venv + pip va benissimo. Impara come funzionano gli ambienti a livello fondamentale prima di aggiungere astrazioni sopra. Quando sentirai il dolore di gestire manualmente il requirements.txt su più progetti, Poetry sarà il passo naturale successivo.

La cosa importante non è quale strumento usi. È che ne usi uno. Lanciare pip install nel Python globale è il modo perfetto per ritrovarti a reinstallare tutto da zero ogni sei mesi.

La regola in una frase

Ogni progetto Python ha il suo ambiente virtuale, sempre, senza eccezioni, anche se è un piccolo script. I tre minuti che servono per configurarlo risparmiano tre ore di debugging di conflitti tra dipendenze dopo.