Quelle est la différence entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc.?

1028

Python 3.3 inclut dans sa bibliothèque standard le nouveau package venv. Que fait-il et en quoi diffère-t-il de tous les autres packages qui semblent correspondre à l'expression régulière (py)?(v|virtual|pip)?env?

Flimm
la source
21
Et pour préempter les votes serrés, je sentais que c'était une question plus générale que stackoverflow.com/questions/29950300/… , et donc je ne me sentais pas à l'aise de modifier cette question ou de poster une réponse trop générale sur ce post.
Flimm
12
Ce guide est à la fois utile et constamment mis à jour car python continue d'ajouter de plus en plus "une et une seule façon évidente" de faire les choses: docs.python-guide.org/en/latest/dev/virtualenvs
michael
2
Depuis la version 3.6, j'ai trouvé plus facile de faire fonctionner virtualenv que pyenv sur macOS (je suis pyNoob)
HashRocketSyntax
@HashRocketSyntax virtualenvet n'exécutent pyenvpas la même fonction, et ne sont pas des alternatives les unes aux autres. Voir ma réponse.
Flimm
7
J'ai brûlé une journée entière en perdant du temps avec pipenv. En bout de ligne, c'est sur-supermarché. Venv et virtualenv si vous avez besoin de py2 sont les bons outils. La conda (miniconda si vous n'avez pas besoin de la pile complète) est également très bonne. Très bon résumé: chriswarrick.com/blog/2018/07/17/…
SwimBikeRun

Réponses:

1384

Paquets PyPI absents de la bibliothèque standard:

  • virtualenvest un outil très populaire qui crée des environnements Python isolés pour les bibliothèques Python. Si vous n'êtes pas familier avec cet outil, je recommande fortement de l'apprendre, car c'est un outil très utile, et je vais faire des comparaisons avec lui pour le reste de cette réponse.

    Il fonctionne en installant un tas de fichiers dans un répertoire (par exemple:) env/, puis en modifiant la PATHvariable d'environnement pour la préfixer avec un binrépertoire personnalisé (par exemple:) env/bin/. Une copie exacte de pythonou python3binaire est placée dans ce répertoire, mais Python est programmé pour rechercher d'abord les bibliothèques par rapport à son chemin, dans le répertoire d'environnement. Il ne fait pas partie de la bibliothèque standard de Python, mais est officiellement béni par la PyPA (Python Packaging Authority). Une fois activé, vous pouvez installer des packages dans l'environnement virtuel à l'aide de pip.

  • pyenvest utilisé pour isoler les versions de Python. Par exemple, vous voudrez peut-être tester votre code par rapport à Python 2.7, 3.6, 3.7 et 3.8, vous aurez donc besoin d'un moyen de basculer entre eux. Une fois activé, il préfixe la PATHvariable d'environnement avec ~/.pyenv/shims, où il y a des fichiers spéciaux correspondant aux commandes Python ( python, pip). Ce ne sont pas des copies des commandes livrées avec Python; ce sont des scripts spéciaux qui décident à la volée de la version de Python à exécuter en fonction de la PYENV_VERSIONvariable d'environnement, du .python-versionfichier ou du ~/.pyenv/versionfichier. pyenvfacilite également le processus de téléchargement et d'installation de plusieurs versions de Python, à l'aide de la commande pyenv install.

  • pyenv-virtualenvest un plugin pour pyenvpar le même auteur que pyenv, pour vous permettre d'utiliser pyenvet virtualenven même temps de manière pratique. Cependant, si vous utilisez Python 3.3 ou une version ultérieure, pyenv-virtualenvessayez de l'exécuter python -m venvs'il est disponible, au lieu de virtualenv. Vous pouvez utiliser virtualenvet pyenvensemble sans pyenv-virtualenv, si vous ne voulez pas les fonctionnalités pratiques.

  • virtualenvwrapperest un ensemble d'extensions pour virtualenv(voir la documentation ). Il vous donne des commandes comme mkvirtualenv, lssitepackageset en particulier workonpour la commutation entre les différents virtualenvrépertoires. Cet outil est particulièrement utile si vous souhaitez plusieurs virtualenvrépertoires.

  • pyenv-virtualenvwrapperest un plug - in pour pyenvle même auteur que pyenv, d'intégrer facilement virtualenvwrapperdans pyenv.

  • pipenvvise à combiner Pipfile, pipet virtualenven une seule commande sur la ligne de commande. Le virtualenvrépertoire est généralement placé dans ~/.local/share/virtualenvs/XXX, avec XXXun hachage du chemin du répertoire du projet. Ceci est différent de virtualenv, où le répertoire se trouve généralement dans le répertoire de travail actuel.pipenvest destiné à être utilisé lors du développement d'applications Python (par opposition aux bibliothèques). Il existe des alternatives à pipenv, telles que poetry, que je n'énumérerai pas ici car cette question concerne uniquement les packages portant le même nom.

Bibliothèque standard:

  • pyvenvest un script livré avec Python 3 mais déconseillé en Python 3.6 car il avait des problèmes (sans parler du nom déroutant). Dans Python 3.6+, l'équivalent exact estpython3 -m venv .

  • venvest un paquet livré avec Python 3, que vous pouvez exécuter en utilisant python3 -m venv(bien que pour une raison quelconque, certaines distributions le séparent dans un paquet de distribution séparé, comme python3-venvsur Ubuntu / Debian). Il sert le même but que virtualenv, mais n'a qu'un sous-ensemble de ses fonctionnalités ( voir une comparaison ici ). virtualenvcontinue d'être plus populaire que venv, d'autant plus que le premier prend en charge Python 2 et 3.

Recommandation pour les débutants:

C'est ma recommandation personnelle pour les débutants: commencez par apprendre virtualenvet pip, des outils qui fonctionnent avec Python 2 et 3 et dans une variété de situations, et prenez d'autres outils une fois que vous commencez à en avoir besoin.

Flimm
la source
116
C'est très utile! Alors pourquoi y a-t-il 8 choses enchevêtrées au lieu d'une? ("Il devrait y avoir une - et de préférence une seule - façon évidente de le faire." - Le Zen de Python)
Jerry101
60
@ Jerry101, l'introduction du venv est en partie une réponse à ce gâchis. Si vous voulez aider à améliorer la situation, je vous suggère d'utiliser le venv et d'encourager les autres à faire de même.
Magnus Lind Oxlund
31
"L'introduction de Venv est en partie une réponse à ce gâchis" . C'est drôle en fait. Nous sommes maintenant 4 ans plus tard ... alors peut-être pertinent de demander, a-t-il venvréellement résolu ce problème?
Kris
35
Les deux seuls outils de la liste qui couvrent vraiment ce qui est sans doute le même territoire sont virtualenv et venv, donc la caractérisation selon laquelle nous avons affaire à un gâchis causé par plusieurs outils concurrents n'est pas très précise. La liste se compose cependant de plusieurs outils liés à l'environnement virtuel, tous avec des noms similaires. Cela peut être déroutant, en particulier pour les utilisateurs qui ne font que les découvrir. Venv a-t-il amélioré la situation? Il offrait une alternative plus légère aux autres outils d'environnement virtuel, bénéficiant de modifications natives et d'une place dans la bibliothèque standard. …
Magnus Lind Oxlund
11
@cowbert Après une mise à niveau de Python 3.5 vers Python 3.6 et la rupture de tous mes virtualenvs, il semble que venvvous puissiez passer à une nouvelle version de Python plus facilement.
Daniel H
277

Je voudrais simplement éviter l'utilisation de virtualenvPython3.3 + et utiliser à la place la bibliothèque standard livrée venv. Pour créer un nouvel environnement virtuel, vous devez taper:

$ python3 -m venv <MYVENV>  

virtualenvessaie de copier le binaire Python dans le répertoire bin de l'environnement virtuel. Cependant, il ne met pas à jour les liens de fichiers de bibliothèque incorporés dans ce binaire, donc si vous construisez Python à partir de la source dans un répertoire non système avec des noms de chemin relatifs, le binaire Python se casse. Puisque c'est ainsi que vous faites une copie Python distribuable, c'est un gros défaut. BTW pour inspecter les liens de fichiers de bibliothèque intégrés sur OS X, utilisez otool. Par exemple, depuis votre environnement virtuel, tapez:

$ 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)

Par conséquent, j'éviterais virtualenvwrapperet pipenv. pyvenvest obsolète. pyenvsemble être utilisé souvent là où il virtualenvest utilisé mais je resterais loin de lui aussi car je pense qu'il fait venvaussi ce pyenvpour quoi il est conçu.

venvcrée des environnements virtuels dans le shell qui sont frais et en bac à sable , avec des bibliothèques installables par l' utilisateur , et il est multi-python sûr . Frais car les environnements virtuels ne commencent qu'avec les bibliothèques standard livrées avec python, vous devez réinstaller toutes les autres bibliothèques pendant pip installque l'environnement virtuel est actif. Sandboxé car aucune de ces nouvelles installations de bibliothèque n'est visible en dehors de l'environnement virtuel, vous pouvez donc supprimer tout l'environnement et recommencer sans vous soucier de l'impact sur votre installation de base de python. Bibliothèques installables par l'utilisateur car le dossier cible de l'environnement virtuel est créé sanssudodans un répertoire que vous possédez déjà, vous n'aurez donc pas besoin d' sudoautorisations pour y installer des bibliothèques. Enfin, il est multi-python sûr , car lorsque les environnements virtuels s'activent, le shell ne voit que la version python (3.4, 3.5 etc.) qui a été utilisée pour construire cet environnement virtuel.

pyenvest similaire venven ce qu'il vous permet de gérer plusieurs environnements python. Cependant, pyenvvous ne pouvez pas facilement restaurer les installations de bibliothèque à un état de démarrage et vous aurez probablement besoin de adminprivilèges à un moment donné pour mettre à jour les bibliothèques. Je pense donc qu'il est également préférable d'utiliser venv.

Au cours des deux dernières années, j'ai trouvé de nombreux problèmes dans les systèmes de construction (packages emacs, constructeurs d'applications autonomes python, installateurs ...) qui finissent par poser des problèmes avec virtualenv. Je pense que python sera une meilleure plate-forme lorsque nous éliminerons cette option supplémentaire et n'utiliserons que venv.

Riaz Rizvi
la source
3
add2virtualenvpeaufine votre PYTHONPATHen ajoutant un _virtualenv_path_extensions.pthfichier personnalisé sous site-packages. Vous pouvez également mettre à jour la PYTHONPATHvariable d'environnement dans le bin/activatefichier que vous appelez chaque fois que vous activez l'environnement virtuel. Ou vous pouvez ajouter des liens symboliques sous site-packagespour pointer vers les répertoires supplémentaires. Ces deux alternatives sont plus transparentes par rapport aux outils de ligne de commande traditionnels que les développeurs utilisent largement pour résoudre les problèmes. L'utilisation d'une coutume .pthavec un nom non documenté, la rend plus magique IMO.
Riaz Rizvi
15
D'accord, j'ai donc confirmé sur stackoverflow.com/questions/48130371/… qu'une mise à jour correcte PYTHONPATHévite le besoin de add2virtualenv. En ce qui concerne le manque d'aide sur SO de votre premier commentaire, ma seule suggestion est de voter pour les réponses si elles résolvent votre problème, pour motiver les gens à vous dépanner lorsque vous postez? Une demi-heure d'enquête + rédaction en échange d'un clic de souris? Cela ressemble à un bon échange ...
Riaz Rizvi
7
Non, vous avez raison - j'essaie d'être bon en matière de vote positif. Heck, si vous étiez dans ma région, je vous achèterais une bière. Je tiendrai ma promesse et je verrai si les gens de doc en python me laisseront ajouter la modification à / bin / activer les documents officiels pour plus de clarté. Bien que je ne sois pas génial, je ne suis pas affreux en python. Si cela a été difficile pour moi ... Quoi qu'il en soit, merci pour votre temps - je vous souhaite le meilleur.
SteveJ
9
@ MalikA.Rumi la bénédiction a été légèrement réduite à "le créateur de Pipenv commercialisé avec diligence pour nous et les autres, c'est pourquoi nous mentionnons Pipenv".
Rob Grant
6
@AndreaMoro C'est ce pyvenvqui est déprécié, non pyenv. Il est si facile de se confondre avec les noms de ces outils.
Daniel Holmes
25

J'ai descendu le pipenvterrier du lapin ( c'est un trou profond et sombre en effet ... ) et depuis la dernière réponse il y a plus de 2 ans , j'ai pensé qu'il était utile de mettre à jour la discussion avec les derniers développements sur le sujet des enveloppes virtuelles Python I ai trouvé.

AVERTISSEMENT:

Cette réponse ne concerne PAS la poursuite du débat qui fait rage sur les mérites de pipenv contre venv en tant que solutions d'enveloppe - je n'approuve pas non plus . Il s'agit de PYPA approuvant des normes contradictoires et comment le développement futur de virtualenv promet d'negate faire un ou l' autre / ou le choix entre eux du tout. Je me suis concentré sur ces deux outils précisément parce qu'ils sont les oints de PyPA .

venv

Comme le note l'OP, venv est un outil de virtualisation des environnements. PAS une solution tierce, mais un outil natif. PyPA approuve venv pour la création d' ENVELOPPES VIRTUELLES : " Modifié dans la version 3.5: L'utilisation de venv est maintenant recommandée pour créer des environnements virtuels ".

pipenv

pipenv - comme venv - peut être utilisé pour créer des enveloppes virtuelles, mais également la gestion des packages et lafonctionnalité de vérification des vulnérabilités . Au lieu d'utiliserrequirements.txt,pipenvfournit la gestion des packages via Pipfile . Comme PyPA approuve pipenv pour la GESTION DES PAQUETS , cela semble impliquerpipfilede supplanterrequirements.txt.

CEPENDANT : pipenv utilise virtualenv comme outil pour créer des enveloppes virtuelles, PAS venv qui est approuvé par PyPA comme l'outil pour créer des enveloppes virtuelles.

Normes contradictoires:

Donc, si s'installer sur une solution d'enveloppe virtuelle n'a pas été assez difficile, PyPA approuve maintenant deux outils différents qui utilisent différentes solutions d'enveloppe virtuelle. Le débat rageur de Github sur venv vs virtualenv qui met en évidence ce conflit peut être trouvé ici .

Résolution de conflit:

Le débat Github référencé dans le lien ci-dessus a orienté le développement de virtualenv dans le sens de l'adaptation de venv dans les versions futures :

préférez venv intégré: si le python cible a venv, nous créerons l'environnement en utilisant cela (puis effectuerons des opérations ultérieures sur celui-ci pour faciliter les autres garanties que nous offrons)

Conclusion:

Il semble donc qu'il y aura une future convergence entre les deux solutions d'enveloppes virtuelles rivales, mais pour l'instant pipenv - qui utilise virtualenv- varie considérablement devenv .

Compte tenu des problèmes que pipenv résout et du fait que PyPA a donné sa bénédiction, il semble avoir un bel avenir. Et si virtualenv atteint ses objectifs de développement proposés, le choix d'une solution d'enveloppe virtuelle ne devrait plus être un cas de pipenv OU venv .

F1Linux
la source
6
D'après ce que j'ai compris: la valeur réelle de pipenv est déjà débattue depuis un certain temps et n'a pas été publiée depuis plus d'un an. Beaucoup de choses ont changé depuis lors, et je dirais que cela n'a fait qu'empirer pour pipenv (les outils tels que la poésie et les pip-tools sont en bien meilleure forme). Les pages PyPA sont obsolètes, et je dirais qu'elles devraient rétrograder pipenv . venv est un outil standard et en tant que tel est très efficace mais dispose d'un ensemble limité de fonctionnalités. virtualenv ne rivalise pas avec venv mais essaie de couvrir les zones où venv ne peut pas ou ne veut pas aller (car c'est un standard).
sinoroc
@sinoroc Mon message ne portait pas sur les mérites ou pipenv., Il s'agissait des directives contradictoires de PyPA approuvant à la fois pipenv ET venv rendant le choix d'une solution d'enveloppe plus difficile et comment il semble qu'un certain degré de convergence annulera la nécessité de choisir entre eux du tout. Notez que je n'approuve rien, je viens de partager ce que j'ai appris sur l'évolution de ces deux solutions approuvées par PyPA . Compte tenu de l'intérêt de PyPA pour eux, que je les aime ou non, cela n'a plus d'importance: pipenv et venv semblaient susceptibles de faire partie du paysage
F1Linux
9
Je dirais de s'en tenir au venv et au pip autant que possible. Ces deux sont là pour rester, venv fait partie de la bibliothèque standard de Python et dans un sens pip également car il est vendu en Python (via Ensurepip ). Les autres outils ( mis à part la série pyenv : tout autre chose) semblent s'appuyer sur ou émuler (avec plus ou moins de succès) venv et pip . Qui est super. Mais si les choses tournent mal , le venv et le pip sont la solution de rechange sûre. Le seul autre outil que j'utilise est tox (avec tox-venv) pour aider à créer et peupler les environnements virtuels (simple, pas de magie, bizarre ce n'est pas encore mentionné).
sinoroc
3
Ce dernier message est en or car il a fait un excellent travail pour aplanir les rides. Je m'en tiens à pip et venv car j'ai eu des problèmes avec les binaires pendants à l'aide de virtualenv lorsque le système python a été mis à niveau.
codeviper
1
dans le passé, j'ai rencontré des problèmes avec pipenv non verbeux sur les erreurs. argl et fossé. Aussi: chriswarrick.com/blog/2018/07/17/…
qrtLs
4

Mise à jour d'avril 2020

Je cherchais la même chose lorsque je suis tombé sur ce post . Je pense que cette question de savoir quel outil utiliser est assez déroutante et difficile pour les nouveaux utilisateurs de Python comme moi. Ceci est directement du site Web de PyPA concernant pipenv:

Bien que ce didacticiel couvre le projet pipenv en tant qu'outil qui se concentre principalement sur les besoins de développement d'applications Python plutôt que sur le développement de bibliothèques Python, le projet lui-même est actuellement en train de résoudre plusieurs problèmes de processus et de maintenance qui empêchent la publication de correctifs de bogues et de nouvelles fonctionnalités ( avec l'intégralité de 2019 passant sans nouvelle version). Cela signifie qu'à court terme, pipenv souffre toujours de plusieurs bizarreries et problèmes de performances sans un calendrier clair pour la résolution de ces émissions.

Bien que cela reste le cas, les responsables de projet voudront probablement étudier d'autres outils pour la gestion des dépendances des applications à utiliser au lieu de, ou avec Pipenv.

En supposant que la version pipenv d'avril 2020 se déroule comme prévu et que la version ultérieure reste également sur la bonne voie, cette mise en garde sur le didacticiel sera supprimée. Si ces versions ne restent pas sur la bonne voie, le didacticiel lui-même sera supprimé et remplacé par une page de discussion sur les options de gestion des dépendances disponibles.

Arnuld
la source
Il semble que pipenv soit actuellement (c'est-à-dire en mai 2020) toujours en pré-version pour la version d'avril 2020. Voyez ici .
andrewjames
Cela ne répond pas à la question.
Flimm
Je pense que @Flimm a bien répondu aux questions. Je répondais à la réponse de
F1Linux
1
En date du 4 Juin 2020, l' pipenvéquipe a publié 2 versions à PyPI: 2020.5.28et plus récemment 2020.6.2: pypi.org/project/pipenv/#history
nonbeing