Quelle est la relation entre virtualenv et pyenv?

175

J'ai récemment appris à utiliser virtualenv et virtualenvwrapper dans mon flux de travail, mais j'ai vu pyenv mentionné dans quelques guides, mais je n'arrive pas à comprendre ce qu'est pyenv et en quoi il est différent / similaire à virtualenv. Pyenv est-il un remplacement meilleur / plus récent pour virtualenv ou un outil complémentaire? Dans ce dernier cas, que fait-il différemment et comment les deux (et virtualenvwrapper le cas échéant) fonctionnent-ils ensemble?

vérité
la source
3
fgimian.github.io/blog/2014/04/20/… : Cependant, il existe une autre alternative appelée pyenv qui présente plusieurs avantages significatifs .
Martijn Pieters
11
Ne soyez pas comme moi et soyez pyenvconfondu avecpyvenv
Utilisateur

Réponses:

162

Pyenv et virtualenv sont des outils très différents qui fonctionnent de différentes manières pour faire des choses différentes:

  • Pyenv est une extension bash - ne fonctionnera pas sous Windows - qui intercepte vos appels à python, pip, etc., pour les diriger vers l'une des nombreuses chaînes d'outils python du système. Ainsi, vous avez toujours toutes les bibliothèques que vous avez installées dans la version python sélectionnée disponibles - en tant que tel, il est bon pour les utilisateurs qui doivent basculer entre différentes versions de python.

  • VirtualEnv , est du python pur et fonctionne donc partout, il fait une copie, éventuellement d'une version spécifique de, python et pip local à l'environnement d'activation qui peut ou non inclure des liens vers la chaîne d'outils système actuelle, si ce n'est pas le cas, vous pouvez installez juste un sous-ensemble connu de bibliothèques dans cet environnement. En tant que tel, il est presque certainement beaucoup mieux pour les tests et le déploiement car vous savez exactement quelles bibliothèques, à quelles versions, sont utilisées et un changement global n'aura pas d'impact sur votre module.

venv python> 3.3

Notez qu'à partir de Python 3.3, il existe une implémentation intégrée de VirtualEnv appelée venv (avec, sur certaines installations, un wrapper appelé pyvenv - ce wrapper est obsolète dans Python 3.6 ), qui devrait probablement être utilisé de préférence. Pour éviter d'éventuels problèmes avec le wrapper, il est souvent judicieux de l'utiliser directement en utilisant /path/to/python3 -m venv desired/env/pathou vous pouvez utiliser l'excellent pysélecteur python sur Windows avec py -3 -m venv desired/env/path. Il créera le répertoire spécifié avec desired/env/pathconfigure et le remplira de manière appropriée. En général, cela ressemble beaucoup à l'utilisation de VirtualEnv.

Outils supplémentaires

Il existe un certain nombre d'outils qu'il convient de mentionner et d'envisager, car ils peuvent aider à utiliser un ou plusieurs des éléments ci-dessus:

  • VirtualEnvWrapper Gérez et simplifiez l'utilisation et la gestion de VirtualEnv - Cross Platform .
  • pyenv-virtualenv , installé par pyenv-installer , qui donne des outils PyEnv pour la gestion et l'interfaçage avec VirtualEnv - avec cela, vous pouvez avoir une installation de base qui comprend plus d'une version de python et créer des environnements isolés dans chacune d'elles - Linux / OS- X . Suggérée par Johann Visagie
  • PyInstaller peut prendre votre code python, éventuellement développé et testé sous VirtualEnv, et le regrouper afin qu'il puisse exécuter une plate-forme sur laquelle votre version de python n'est pas installée - Notez que ce n'est pas un compilateur croisé, vous aurez besoin d'un Windows (virtuel -) machine pour construire des installations Windows, etc., mais cela peut être pratique même lorsque vous pouvez être sûr que python sera installé mais ne pouvez pas être sûr que la version de python et toutes les bibliothèques seront compatibles avec votre code.
Steve Barnes
la source
3
Cela vaut probablement la peine de mentionner pyenv-virtualenv, un plugin pyenv qui permet à pyenv et virtualenv de fonctionner de manière transparente à l'unisson. Si vous avez installé pyenv à l'aide de pyenv-installer, pyenv-virtualenv sera déjà présent. * github.com/yyuu/pyenv-virtualenv * github.com/yyuu/pyenv-installer
wjv
1
Et venvmaintenant dans la bibliothèque standard?
Flimm
@Flimm: À partir de python 3.3, venv fait partie de la bibliothèque standard et devrait être utilisé à la place de virtualenv car il est souvent décrit comme "virtualenv done right" - reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv
Steve Barnes
2
pyenv-virtualenv n'est pas (ou du moins n'est plus) uniquement Linux. Il existe un package homebrew pour une installation facile sur MacOS.
Tournez le
Merci d'avoir souligné l'interopérabilité!
HashRocketSyntax
16

virtualenvvous permet de créer une installation Python personnalisée, par exemple dans un sous-répertoire de votre projet. Chacun de vos projets peut ainsi avoir sa propre python(voire plusieurs) sous son virtualenv respectif. Il est parfaitement normal que certains / tous les virtualenv aient même la même version de python(par exemple 2.7.16) sans conflit - ils vivent séparément et ne se connaissent pas. Si vous voulez utiliser l'un de ces pythons, vous devez le faire activate(en exécutant un script qui modifiera temporairement votre PATHpour vous assurer que le bin/répertoire de virtualenv vient en premier). À partir de là, l'appel python(ou pipetc.) appellera la version de virtualenv jusqu'à ce que vous l'ayez deactivate(qui restaure le PATH).

pyenvfonctionne à une échelle plus large que virtualenv- il contient un registre des installations Python (et peut être utilisé pour en installer de nouvelles) et vous permet de configurer la version de Python à exécuter lorsque vous utilisez la pythoncommande. Cela semble similaire mais l'utilisation pratique est un peu différente. Il fonctionne en ajoutant son pythonscript shim à votre PATH(de façon permanente) et en décidant ensuite quel "réel" pythonappeler. Vous pouvez même configurer pyenv pour qu'il appelle l'un de vos pythons virtualenv (en utilisant le pyenv-virtualenvplugin). Les versions de Python que vous installez en utilisant pyenvvont dans son $(pyenv root)/versions/répertoire (par défaut, pyenv root est ~ / .pyenv) sont donc plus «globales» que virtualenv. Normalement, vous ne pouvez pas dupliquer les versions de Python installées via pyenv, du moins ce n'est pas l'idée principale.

Pour créer un virtualenv avec une version spécifique de Python, vous devez avoir cette version quelque part dans votre système (que ce soit sur le PATHou non) et essentiellement la cloner dans votre virtualenv nouvellement créé. Bien entendu, une façon d'obtenir une version particulière est de l'installer via pyenv. Une fois que cela est fait, les virtualenv individuels sont libres de diverger en ayant différents modules (ou versions de ceux-ci) installés en eux.

En bref:

  • virtualenv vous permet de créer des installations python locales et indépendantes en clonant à partir de celles existantes
  • pyenv vous permet d'installer différentes versions de python simultanément (soit à l'échelle du système ou juste pour l'utilisateur local), puis de choisir lequel de la multitude de pythons à exécuter à tout moment (y compris ceux créés par virtualenv ou Anaconda)
Błażej Czapp
la source