Python virtualenv e venv cosa fare e cosa non fare

Uno dei maggiori vantaggi di Python è il suo vasto ecosistema di pacchetti di terze parti. Se c'è un'attività che vuoi portare a termine - conversione del formato di file, scraping e ristrutturazione di pagine web, regressione lineare, lo chiami - è probabile che uno o più pacchetti nell'Indice dei pacchetti Python soddisferanno il tuo bisogno.

La parte difficile è gestire l'accumulo di pacchetti in una determinata installazione di Python. È fin troppo facile installare sconsideratamente dozzine di pacchetti e nel tempo si finisce con un ambiente Python irto di conflitti tra le versioni più vecchie e più recenti degli strumenti, rendendo il lavoro più difficile di quanto dovrebbe essere.

Python viene fornito con un sistema automatizzato per mantenere un set di pacchetti locale per un determinato progetto Python. Gli ambienti virtuali, grazie allo virtualenvstrumento in Python 2 e venvin Python 3, possono essere utilizzati per creare un'istanza separata e isolata del runtime Python per un progetto, con il proprio complemento di pacchetti.

In questo articolo esamineremo alcuni degli errori più comuni che le persone commettono - e i trucchi a cui soccombono - quando lavorano con ambienti virtuali in Python. 

Usa ambienti virtuali Python 

Il primo errore comune che i programmatori Python commettono virtualenvvenvè semplicemente non preoccuparsene. Se tutto ciò che stai facendo è mettere insieme uno script veloce e sporco per fare una piccola cosa , perché preoccuparsi di creare un ambiente virtuale?

Il problema è che "una piccola cosa" spesso si rivela molto, molto di più. Man mano che la tua padronanza di Python cresce, finirai inevitabilmente per inserire più moduli di terze parti per realizzare un lavoro più sofisticato. Inoltre, troverai sempre più difficile gestire le dipendenze dalle versioni precedenti dei pacchetti, uno dei problemi chiave per cui sono stati creati gli ambienti virtuali.

Alcune persone arricciano il naso anche quando usano virtualenvvenvperché ogni ambiente virtuale è la propria piccola copia del runtime Python, occupando circa 25 MB. Ma lo spazio su disco è ridicolmente a buon mercato in questi giorni e la rimozione di un ambiente virtuale è straordinariamente semplice come eliminarne la directory (senza effetti collaterali). Inoltre, se hai più attività che condividono un insieme comune di pacchetti, puoi sempre utilizzare lo stesso ambiente virtuale per entrambi.

Usa virtualenvwrapper per gestire gli ambienti virtuali Python

Un modo per rendere gli ambienti virtuali meno gravosi è quello di utilizzare  virtualenvwrapper. Questo strumento ti consente di gestire tutti gli ambienti virtuali nel tuo spazio di lavoro da un'unica app a riga di comando centrale.

Un consiglio sulla creazione dell'ambiente virtuale: non nominare la directory del tuo ambiente virtuale  venvo, se è per questo, il nome di qualsiasi altro pacchetto che desideri utilizzare nell'ambiente virtuale. Ciò può avere effetti imprevedibili sulle importazioni successive. Usa un nome che descriva il tuo progetto in modo inequivocabile.

Non posizionare file di progetto all'interno di un ambiente virtuale Python

Quando si imposta un ambiente virtuale, la directory in cui risiede non è pensata per contenere nient'altro che l'ambiente virtuale stesso. Il tuo progetto appartiene al proprio albero di directory separato. Ci sono molte buone ragioni per questo:

  • La struttura della directory del progetto potrebbe avere una convenzione di denominazione che collide con gli elementi dell'ambiente virtuale.
  • Il modo più semplice per rimuovere un ambiente virtuale è eliminare la directory. Mescolare i file di progetto con l'ambiente virtuale significa che devi prima districare i due.
  • Più progetti possono utilizzare lo stesso ambiente virtuale.

Un modo per organizzare le cose sarebbe creare una directory di primo livello che contiene diversi ambienti virtuali e un'altra directory di primo livello che contiene i progetti. Finché i due sono tenuti separati, questo è ciò che conta.

Non dimenticare di attivare il tuo ambiente virtuale Python 

Un altro errore comune che le persone commettono con gli ambienti virtuali è dimenticare di attivarli o non attivare quello giusto.

Prima che un ambiente virtuale possa essere utilizzato in una particolare sessione di shell, deve essere attivato , tramite uno script denominato activatenella Scriptsdirectory dell'ambiente virtuale . Dopo l'attivazione, l'ambiente virtuale viene considerato come l'istanza Python predefinita fino a quando non viene disattivata (eseguendo il deactivatecomando).

È facile dimenticare questo passaggio all'inizio, sia perché è un'abitudine che deve essere acquisita, sia perché lo script di attivazione è un livello più in basso nella directory dell'ambiente virtuale. Un paio di trucchi tornano utili qui:

  1. Crea collegamenti agli script di attivazione / disattivazione nella directory principale del tuo progetto. Puoi denominare queste scorciatoie in modo semplice come acte deactrenderle meno fastidiose da digitare.
  2. Per i progetti su cui lavori da un IDE e non da una riga di comando, crea un programma di avvio del progetto, un file batch o uno script di shell, per l'app Python in questione. Ciò ti consente di chiamare lo script di attivazione, quindi eseguire il tuo script in seguito. In genere non è necessario disattivare l'ambiente di script dopo l'esecuzione, poiché la sessione terminerà comunque da sola.

Quest'ultimo trucco sottolinea un punto importante sulle attivazioni dell'ambiente virtuale: si applicano solo alla sessione dell'ambiente in cui vengono eseguiti. Ad esempio, se avvii due sessioni della riga di comando e attivi un ambiente virtuale in una, l'altra sessione della riga di comando utilizzerà l'installazione Python predefinita del sistema, non l'ambiente virtuale. Non stai attivando l'ambiente virtuale per il sistema nel suo insieme , ma solo per la sessione specifica.

Non utilizzare  >=per il blocco della versione del pacchetto in un ambiente virtuale Python

Questo suggerimento è utile anche al di fuori degli ambienti virtuali. Quando hai un'app con un requirements.txtfile, devi specificare i pacchetti con un numero di versione esatto . Di ' mypackage==2.2no mypackage>=2.2.

Ecco perché. Uno dei motivi principali per utilizzare un ambiente virtuale è garantire l'uso di versioni specifiche dei pacchetti. Se usi >=invece di ==, non c'è alcuna garanzia che tu, o qualcun altro, finirai con la stessa versione se l'ambiente deve essere ricreato per quel progetto. Usa un numero di versione esatto. Tu, un futuro tu e chiunque altro verrà dopo di te ti ringrazierà.