Qual è la differenza tra venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, ecc?


1027

Python 3.3 include nella sua libreria standard il nuovo pacchetto venv. Cosa fa e in cosa differisce da tutti gli altri pacchetti che sembrano corrispondere alla regex (py)?(v|virtual|pip)?env?


21
E per evitare i voti stretti, ho sentito che questa era una domanda più generale di stackoverflow.com/questions/29950300/… , e quindi non mi sentivo a mio agio nel modificare quella domanda o pubblicare una risposta eccessivamente generale su quel post.
Flimm,

12
Questa guida è utile e costantemente aggiornata poiché Python continua ad aggiungere sempre più "un solo modo ovvio" per fare le cose: docs.python-guide.org/en/latest/dev/virtualenvs
michael

2
A partire da 3.6 ho trovato più facile far funzionare virtualenv rispetto a pyenv su macOS (sono un pyNoob)
HashRocketSyntax

@HashRocketSyntax virtualenve pyenvnon svolgono la stessa funzione e non sono alternative l'una all'altra. Vedi la mia risposta
Flimm,

7
Ho bruciato un'intera giornata a perdere tempo con Pipenv. In conclusione, è troppo caro. Venv e virtualenv se hai bisogno di py2 sono gli strumenti adeguati. Anche la conda (miniconda se non è necessario lo stack completo) è molto buona. Scrittura molto buona: chriswarrick.com/blog/2018/07/17/…
SwimBikeRun

Risposte:


1384

Pacchetti PyPI non presenti nella libreria standard:

  • virtualenvè uno strumento molto popolare che crea ambienti Python isolati per le librerie Python. Se non hai familiarità con questo strumento, ti consiglio vivamente di impararlo, in quanto è uno strumento molto utile e farò un confronto con esso per il resto di questa risposta.

    Funziona installando un gruppo di file in una directory (ad esempio:) env/, e quindi modificando la PATHvariabile di ambiente per prefissarla con una bindirectory personalizzata (ad esempio:) env/bin/. Una copia esatta del binario pythono python3è collocata in questa directory, ma Python è programmato per cercare prima le librerie relative al suo percorso, nella directory di ambiente. Non fa parte della libreria standard di Python, ma è ufficialmente benedetto dal PyPA (Python Packaging Authority). Una volta attivato, è possibile installare i pacchetti nell'ambiente virtuale utilizzando pip.

  • pyenvviene utilizzato per isolare le versioni di Python. Ad esempio, potresti voler testare il tuo codice con Python 2.7, 3.6, 3.7 e 3.8, quindi avrai bisogno di un modo per passare da uno all'altro. Una volta attivato, prefigura la PATHvariabile d'ambiente con ~/.pyenv/shims, dove ci sono file speciali corrispondenti ai comandi Python ( python, pip). Queste non sono copie dei comandi forniti da Python; sono script speciali che decidono al volo quale versione di Python eseguire in base alla PYENV_VERSIONvariabile di ambiente, al .python-versionfile o al ~/.pyenv/versionfile. pyenvrende anche il processo di download e l'installazione di più versioni di Python più facile, usando il comando pyenv install.

  • pyenv-virtualenvè un plug-in pyenvdello stesso autore pyenv, per permetterti di usarlo pyenve virtualenvallo stesso tempo comodamente. Tuttavia, se stai utilizzando Python 3.3 o versioni successive, pyenv-virtualenvproverà a eseguirlo python -m venvse è disponibile, anziché virtualenv. È possibile utilizzare virtualenve pyenvinsieme senza pyenv-virtualenv, se non si desidera le funzionalità di convenienza.

  • virtualenvwrapperè un insieme di estensioni a virtualenv(vedi documenti ). Ti dà comandi come mkvirtualenv, lssitepackagese soprattutto workonper passare da una virtualenvdirectory all'altra. Questo strumento è particolarmente utile se si desidera più virtualenvdirectory.

  • pyenv-virtualenvwrapperè un plugin per pyenvlo stesso autore pyenv, per integrarsi comodamente virtualenvwrapperin pyenv.

  • pipenvmira a combinare Pipfile, pipe virtualenvin un solo comando sulla riga di comando. La virtualenvdirectory viene generalmente inserita ~/.local/share/virtualenvs/XXX, XXXessendo un hash del percorso della directory del progetto. Ciò è diverso da virtualenvdove la directory si trova in genere nella directory di lavoro corrente. pipenvè pensato per essere utilizzato durante lo sviluppo di applicazioni Python (al contrario delle librerie). Ci sono alternative pipenv, come poetry, che non elencherò qui poiché questa domanda riguarda solo i pacchetti che hanno un nome simile.

Biblioteca standard:

  • pyvenvè uno script fornito con Python 3 ma deprecato in Python 3.6 poiché aveva problemi (per non parlare del nome confuso). In Python 3.6+, l'equivalente esatto è python3 -m venv.

  • venvè un pacchetto fornito con Python 3, che puoi eseguire usando python3 -m venv(anche se per qualche ragione alcune distro lo separano in un pacchetto distro separato, come python3-venvsu Ubuntu / Debian). Ha lo stesso scopo di virtualenv, ma ha solo un sottoinsieme delle sue caratteristiche ( vedere un confronto qui ). virtualenvcontinua ad essere più popolare di venv, soprattutto perché il primo supporta sia Python 2 che 3.

Raccomandazione per i principianti:

Questa è la mia raccomandazione personale per i principianti: inizia imparando virtualenve pip, strumenti che funzionano con Python 2 e 3 e in una varietà di situazioni, e raccogli altri strumenti quando inizi a averne bisogno.


116
Questo è molto utile! Quindi perché ci sono 8 cose aggrovigliate invece di 1? ("Dovrebbe esserci uno - e preferibilmente solo uno - modo ovvio per farlo." - Lo Zen di Python)
Jerry101

60
@ Jerry101, l'introduzione di venv è in parte una risposta a quel casino. Se vuoi aiutare a migliorare la situazione, ti suggerisco di usare Venv e incoraggiare gli altri a fare lo stesso.
Magnus Lind Oxlund,

31
"L'introduzione di Venv è in parte una risposta a quel casino" Come mai quando ci sono troppe cose che fanno "qualcosa come X", le persone pensano sempre di poter migliorare quel casino facendo un'altra cosa che fa "qualcosa come X" . È davvero divertente. Siamo passati 4 anni dopo ... quindi potrebbe essere pertinente chiederlo, hai venvdavvero risolto quel problema?
Kris,

35
Gli unici due strumenti nell'elenco che coprono veramente quello che è probabilmente lo stesso territorio sono virtualenv e venv, quindi la caratterizzazione che stiamo affrontando con un casino causato da diversi strumenti concorrenti non è molto precisa. L'elenco comprende tuttavia diversi strumenti virtuali relativi all'ambiente, tutti con nomi simili. Questo può essere fonte di confusione, soprattutto per gli utenti che stanno solo imparando a conoscerli. Venv ha migliorato la situazione? Ha offerto un'alternativa più leggera ad altri strumenti di ambiente virtuale, beneficiando di modifiche native e un posto nella libreria standard. ...
Magnus Lind Oxlund,

11
@cowbert Dopo aver appena eseguito l'aggiornamento da Python 3.5 a Python 3.6 e aver rotto tutti i miei virtualenvs, sembra che venvti permetta di passare a una nuova versione di Python più facilmente.
Daniel H,

277

Vorrei solo evitare l'uso di virtualenvdopo Python3.3 + e invece utilizzare la libreria standard fornita venv. Per creare un nuovo ambiente virtuale, digitare:

$ python3 -m venv <MYVENV>  

virtualenvtenta di copiare il binario Python nella directory bin dell'ambiente virtuale. Tuttavia, non aggiorna i collegamenti ai file di libreria incorporati in quel file binario, quindi se si crea Python dall'origine in una directory non di sistema con nomi di percorso relativi, il binario Python si interrompe. Dato che è così che rendi una copia distribuibile di Python, è un grosso difetto. BTW per ispezionare i collegamenti ai file della libreria incorporata su OS X, utilizzare otool. Ad esempio dall'ambiente virtuale, digitare:

$ otool -L bin/python
python:
    @executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

Di conseguenza eviterei virtualenvwrappere pipenv. pyvenvè deprecato. pyenvsembra essere usato spesso dove virtualenvviene utilizzato, ma vorrei stare lontano da esso anche perché penso che venvfaccia anche quello per cui pyenvè stato progettato.

venvcrea ambienti virtuali nella shell che sono freschi e in modalità sandbox , con librerie installabili dall'utente ed è sicuro per più pitoni . Fresco perché gli ambienti virtuali iniziano solo con le librerie standard fornite con Python, è necessario installare nuovamente tutte le altre librerie pip installmentre l'ambiente virtuale è attivo. Sandbox perché nessuna di queste nuove installazioni di librerie è visibile al di fuori dell'ambiente virtuale, quindi è possibile eliminare l'intero ambiente e ricominciare senza preoccuparsi di influire sull'installazione di Python di base. Librerie installabili dall'utente perché la cartella di destinazione dell'ambiente virtuale viene creata senzasudoin alcune directory che già possiedi, quindi non avrai bisogno delle sudoautorizzazioni per installare le librerie al suo interno. Infine è multi-python sicuro , poiché quando gli ambienti virtuali si attivano, la shell vede solo la versione di Python (3.4, 3.5 ecc.) Che è stata utilizzata per creare quell'ambiente virtuale.

pyenvè simile al fatto venvche ti consente di gestire più ambienti Python. Tuttavia, con pyenvte non è possibile eseguire il rollback delle installazioni delle librerie su un certo stato iniziale e probabilmente avrai bisogno dei adminprivilegi per aggiornare le librerie. Quindi penso che sia anche meglio usare venv.

Negli ultimi due anni ho riscontrato molti problemi nei sistemi di compilazione (pacchetti emacs, compilatori di applicazioni standalone python, programmi di installazione ...) che alla fine si sono risolti con problemi virtualenv. Penso che Python sarà una piattaforma migliore quando elimineremo questa opzione aggiuntiva e useremo solo venv.


3
add2virtualenvottimizza il tuo PYTHONPATHaggiungendo un _virtualenv_path_extensions.pthfile personalizzato sotto site-packages. In alternativa, è possibile aggiornare la PYTHONPATHvariabile di ambiente nel bin/activatefile che si chiama ogni volta che si attiva l'ambiente virtuale. Oppure puoi aggiungere collegamenti simbolici site-packagesper indicare le directory extra. Entrambe queste alternative sono più trasparenti rispetto ai tradizionali strumenti a riga di comando che gli sviluppatori utilizzano ampiamente per la risoluzione dei problemi. L'uso di un'usanza .pthcon un nome non documentato, fa sembrare IMO più magico.
Riaz Rizvi,

15
Va bene, quindi ho confermato su stackoverflow.com/questions/48130371/… che un aggiornamento corretto per ovviare alla PYTHONPATHnecessità add2virtualenv. Per quanto riguarda la mancanza di aiuto su SO dal tuo primo commento, il mio unico suggerimento sono le risposte positive se risolvono il tuo problema, per motivare le persone a risolvere i problemi per te quando pubblichi? Mezz'ora di investigazione + scrivere in cambio di un clic del mouse? Sembra un buon affare ...
Riaz Rizvi,

7
No, hai ragione - cerco di essere bravo a votare. Cavolo, se tu fossi nella mia zona ti comprerei una birra. Manterrò la mia promessa e vedrò se la gente di Python Doc mi permetterà di aggiungere la modifica a / bin / attivare i documenti ufficiali per chiarezza. Anche se non sono eccezionale, non sono terribile con Python. Se è stato difficile per me ... Comunque, grazie per il tuo tempo - ti auguro il meglio.
SteveJ

9
@ MalikA.Rumi la benedizione è stata leggermente ridotta a "il creatore Pipenv diligentemente commercializzato a noi e agli altri, motivo per cui citiamo Pipenv".
Rob Grant,

6
@AndreaMoro È pyvenvdeprecato, no pyenv. È così facile confondersi con i nomi di questi strumenti.
Daniel Holmes,

25

Sono andato nella pipenvtana del coniglio ( è davvero un buco profondo e scuro ... ) e poiché l'ultima risposta è di oltre 2 anni fa , ho ritenuto utile aggiornare la discussione con gli ultimi sviluppi sull'argomento delle buste virtuali di Python I ho trovato.

NOTA BENE:

Questa risposta NON riguarda il proseguimento del dibattito infuriato sui meriti di pipenv contro venv come soluzioni di inviluppo. Neanche io approvo . Si tratta di PyPA che approva gli standard in conflitto e di come il futuro sviluppo di virtualenv promette di negare di fare una o entrambe le scelte. Mi sono concentrato su questi due strumenti proprio perché sono quelli unti di PyPA .

venv

Come osserva l'OP, venv è uno strumento per virtualizzare gli ambienti. NON una soluzione di terze parti, ma strumento nativo. PyPA approva venv per la creazione di BUSTE VIRTUALI : " Modificato nella versione 3.5: L'uso di venv è ora raccomandato per la creazione di ambienti virtuali ".

pipenv

pipenv - come venv - può essere usato per creare buste virtuali ma anchefunzionalità digestione dei pacchetti roll-in e controllo delle vulnerabilità . Invece di utilizzarerequirements.txt,pipenvoffre la gestione dei pacchetti tramite Pipfile . Dato che PyPA approva pipenv per la GESTIONE DEI PACCHETTI , ciò che sembra implicarepipfileè soppiantarerequirements.txt.

TUTTAVIA : pipenv utilizza virtualenv come strumento per la creazione di buste virtuali, NON venv, che è approvato da PyPA come strumento di riferimento per la creazione di buste virtuali.

Standard contrastanti:

Quindi, se accontentarsi di una soluzione di inviluppo virtuale non fosse abbastanza difficile, ora abbiamo PyPA che approva due diversi strumenti che utilizzano diverse soluzioni di inviluppo virtuale. Il furioso dibattito di Github su venv vs virtualenv che mette in evidenza questo conflitto può essere trovato qui .

Risoluzione del conflitto:

Il dibattito Github a cui si fa riferimento nel link sopra ha orientato lo sviluppo di virtualenv nella direzione di accomodare venv nelle versioni future :

preferisce venv integrato: se il python target ha venv creeremo l'ambiente usando quello (e quindi eseguiremo le operazioni successive su quello per facilitare altre garanzie che offriamo)

Conclusione:

Quindi sembra che ci sarà una certa convergenza futura tra le due soluzioni concorrenti di inviluppo virtuale, ma a partire da ora pipenv - che utilizza virtualenv- varia materialmente da venv.

Dati i problemi che pipenv risolve e il fatto che PyPA abbia dato la sua benedizione, sembra avere un futuro brillante. E se virtualenv realizza gli obiettivi di sviluppo proposti, la scelta di una soluzione di inviluppo virtuale non dovrebbe più essere un caso di pipenv o di venv .


6
Da quello che ho capito: il valore reale di pipenv è stato discusso per un po 'di tempo e non è stato rilasciato da oltre un anno. Da allora molte cose sono cambiate e direi che è peggiorato solo per pipenv (strumenti come la poesia e gli strumenti per pip sono in una forma molto migliore). Le pagine di PyPA sono obsolete e direi che dovrebbero degradare pipenv . venv è uno strumento standard e come tale è molto efficiente ma ha un set limitato di funzionalità. virtualenv non compete con venv ma cerca di coprire le aree in cui venv non può o non vuole andare (poiché è uno standard).
sinoroc

@sinoroc Il mio post non era circa i meriti o pipenv., Era circa la guida di conflitto PyPA approvando sia pipenv E venv facendo la scelta di una soluzione busta più difficile e come appare certo grado di Converge sarà negare la necessità di scegliere tra loro a tutti. Si noti che non approvo nulla, ho solo condiviso ciò che ho imparato su come si stanno evolvendo queste due soluzioni approvate da PyPA . Dato l'interesse di PyPA in loro, se mi piace o no diventa irrilevante: pipenv e venv sembrava probabile per diventare una parte del paesaggio
F1Linux

9
Direi attenersi a venv e pip il più possibile. Questi due sono qui per restare, venv fa parte della libreria standard di Python e in un certo senso pip e poiché è venduto in Python (tramite surepip ). Gli altri strumenti (a parte la serie pyenv : cosa completamente diversa) sembrano fare affidamento o emulare (con più o meno successo) venv e pip . Che è grandioso. Ma se le cose vanno male , venv e pip sono il fallback sicuro. L'unico altro strumento che uso è tox (con tox-venv) per aiutare a creare e popolare gli ambienti virtuali (semplice, senza magia, strano non è ancora menzionato).
sinoroc

3
Quest'ultimo post è d'oro perché ha fatto un ottimo lavoro per stirare le rughe. Mi attengo a pip e venv poiché ho avuto problemi con i binari penzolanti utilizzando virtualenv quando è stato aggiornato il sistema Python.
codeviper

1
in passato ho riscontrato problemi con pipenv nonverbose su errori. argl and ditch. Inoltre: chriswarrick.com/blog/2018/07/17/…
qrtLs

4

Aggiornamento di aprile 2020

Stavo cercando lo stesso quando mi sono imbattuto in questo post . Penso che questo problema di quale strumento usare sia abbastanza confuso e difficile per i nuovi utenti di Python come me. Questo è direttamente dal sito web PyPA per quanto riguarda pipenv:

Mentre questo tutorial copre il progetto pipenv come uno strumento che si concentra principalmente sulle esigenze dello sviluppo di applicazioni Python piuttosto che sullo sviluppo delle librerie Python, il progetto stesso sta attualmente lavorando attraverso diversi problemi di processo e manutenzione che impediscono la pubblicazione di correzioni di bug e nuove funzionalità ( per tutto il 2019 che passa senza una nuova versione). Ciò significa che a breve termine, pipenv soffre ancora di diverse stranezze e problemi di prestazioni senza una chiara tempistica per la risoluzione di tali problemi.

Sebbene ciò rimanga il caso, è probabile che i manutentori del progetto desiderino indagare su altri strumenti per la gestione delle dipendenze delle applicazioni da utilizzare al posto o insieme a pipenv.

Supponendo che il rilascio di pipenv dell'aprile 2020 proceda come previsto, e anche il rilascio successivo continuerà a funzionare, quindi questo avvertimento sul tutorial verrà rimosso. Se tali versioni non rimangono in pista, il tutorial stesso verrà rimosso e sostituito con una pagina di discussione sulle opzioni di gestione delle dipendenze disponibili.


Sembra che pipenv sia attualmente (cioè a maggio 2020) ancora in pre-release per la versione di aprile 2020. Vedi qui .
andrewjames

Questo non risponde alla domanda.
Flimm,

Penso che @Flimm abbia risposto bene alle domande. Stavo rispondendo alla risposta di F1Linux
Arnuld

1
Come, del 4 giugno 2020, il pipenvteam ha rilasciato 2 versioni a PyPI: 2020.5.28e, più recentemente, 2020.6.2: pypi.org/project/pipenv/#history
nonbeing
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.