2017-01-10 1 views
182

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 paquets qui semblent correspondre à la regex (py)?(v|virtual|pip)?env?Quelle est la différence entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc?

+3

Et pour préempter les votes proches, j'ai senti que c'était une question plus générale que http://stackoverflow.com/questions/29950300/what-is-the-relationship-between-virtualenv-and-pyenv, et donc je ne se sentait pas à l'aise d'éditer cette question ou de poster une réponse trop générale sur ce post. – Flimm

+0

Ce guide est à la fois utile et constamment mis à jour car python continue d'ajouter de plus en plus «un seul et unique moyen» de faire les choses: http://docs.python-guide.org/en/latest/dev/virtualenvs/ – michael

+0

A partir de 3.6, j'ai trouvé plus facile de faire fonctionner virtualenv en comparaison de pyenv sur macOS (je suis un pyNoob) – HashRocketSyntax

Répondre

286

paquets PyPI pas dans la bibliothèque standard:

  • virtualenv est 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 pour le reste de cette réponse.

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

  • pyenv est utilisé pour isoler les versions de Python. Par exemple, vous pouvez tester votre code avec Python 2.6, 2.7, 3.3, 3.4 et 3.5, vous aurez donc besoin d'un moyen de basculer entre eux. Une fois activé, il préfixe la variable d'environnement PATH avec ~/.pyenv/shims, où des fichiers spéciaux correspondent aux commandes Python (python, pip). Ce ne sont pas des copies des commandes fournies par Python; ce sont des scripts spéciaux qui décident à la volée de la version de Python à exécuter en fonction de la variable d'environnement PYENV_VERSION ou du fichier .python-version ou du fichier ~/.pyenv/version. pyenv facilite également le téléchargement et l'installation de plusieurs versions de Python à l'aide de la commande pyenv install.

  • pyenv-virtualenv est un plugin pour pyenv par le même auteur que pyenv, pour vous permettre d'utiliser pyenv et virtualenv en même temps commodément. Toutefois, si vous utilisez Python 3.3 ou version ultérieure, pyenv-virtualenv va essayer d'exécuter python -m venv s'il est disponible, au lieu de virtualenv. Vous pouvez utiliser virtualenv et pyenv ensemble sans pyenv-virtualenv, si vous ne voulez pas les fonctionnalités de commodité.

  • virtualenvwrapper est un ensemble d'extensions pour virtualenv (voir docs). Il vous donne des commandes comme mkvirtualenv, lssitepackages, et surtout workon pour basculer entre différents répertoires virtualenv. Cet outil est particulièrement utile si vous voulez plusieurs répertoires virtualenv.

  • pyenv-virtualenvwrapper est un plugin pour pyenv par le même auteur que pyenv, d'intégrer facilement dans virtualenvwrapperpyenv.

  • pipenv, par Kenneth Reitz (l'auteur de requests), est le plus récent projet dans cette liste. Il vise à combiner Pipfile, pip et virtualenv en une seule commande sur la ligne de commande.

bibliothèque standard:

  • pyvenv est un script fourni avec Python 3, mais deprecated in Python 3.6 comme il a eu des problèmes (pour ne pas mentionner le nom de confusion). En Python 3.6+, l'équivalent exact est python3 -m venv.

  • venv est un package livré avec Python 3, que vous pouvez utiliser avec python3 -m venv (même si pour une raison quelconque certains distros il se séparent en un paquet de distribution séparé, tel que python3-venv sur Ubuntu/Debian). Il sert un but similaire à virtualenv, et fonctionne de manière très similaire, mais il n'a pas besoin de copier les binaires Python (sauf sur Windows). Utilisez ceci si vous n'avez pas besoin de supporter Python 2. Au moment de l'écriture, la communauté Python semble être heureuse avec virtualenv et je n'ai pas beaucoup entendu parler de venv.

+53

J'aime quand les gens répondent à des questions que je ne savais même pas que j'avais. – skrrgwasme

+10

Ceci est très utile! Alors pourquoi y a-t-il 8 choses enchevêtrées au lieu de 1? ("Il devrait y avoir une - et de préférence une seule - façon évidente de le faire." - Le Zen de Python) – Jerry101

+0

@skrrgwasme Parfois, des inconnues inconnues ne sont pas nécessaires. – smwikipedia

28

Je voudrais juste éviter l'utilisation de virtualenv après Python3.3 + et utiliser à la place de la bibliothèque standard livré venv. Pour créer un nouvel environnement virtuel, vous tapez:

$ python3 -m venv <MYVENV> 

virtualenv essaie 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 intégrés dans ce binaire, donc si vous compilez Python de source dans un répertoire non-système avec des noms de chemins relatifs, le binaire Python se brise. Puisque c'est comme ça 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 à partir de 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'éviterait virtualenvwrapper et pipenv. pyvenv est obsolète. pyenv semble être utilisé souvent où virtualenv est utilisé mais je voudrais rester à l'écart aussi depuis que je pense que venv fait aussi ce pyenv est construit pour.

venv crée des environnements virtuels dans la coquille qui sont frais et sandbox, avec bibliothèques installables par l'utilisateur, et il est multi-python sûr. Fresh car les environnements virtuels commencent seulement avec les bibliothèques standard livrées avec python, vous devez réinstaller toutes les autres bibliothèques avec pip install pendant que l'environnement virtuel est actif. Sandboxed car aucune de ces nouvelles installations de bibliothèque n'est visible en dehors de l'environnement virtuel. Vous pouvez donc supprimer l'intégralité de l'environnement et recommencer sans vous soucier de l'impact de votre installation Python de base.Bibliothèques installables par l'utilisateur car le dossier cible de l'environnement virtuel est créé sans sudo dans un répertoire que vous possédez déjà, vous n'avez donc pas besoin des autorisations sudo pour y installer des bibliothèques. Enfin c'est multi-python safe, puisque lorsque les environnements virtuels sont activés, le shell ne voit que la version python (3.4, 3.5 etc.) qui a été utilisée pour construire cet environnement virtuel.

est similaire à venv en ce qu'il vous permet de gérer plusieurs environnements python. Cependant, avec pyenv, vous ne pouvez pas facilement restaurer les installations de la bibliothèque à un état initial et vous aurez probablement besoin des privilèges admin pour mettre à jour les bibliothèques. Donc, je pense 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 (paquets emacs, constructeurs d'applications autonomes python, installateurs ...) qui se résument à virtualenv. Je pense que python sera une meilleure plate-forme lorsque nous éliminerons cette option supplémentaire et n'utiliserons que venv.

+0

Sauf que venv semble manquer des éléments fondamentaux (comme un analogue à add2virtualenv), ce qui rend la gestion des importations pénible. Et, bonne chance en essayant d'aider à l'utiliser sur SO. J'ai essayé de passer à venv; Cela a été si douloureux que je suis revenu en arrière. – SteveJ

+1

'add2virtualenv' ajuste votre' PYTHONPATH' en ajoutant un fichier '_virtualenv_path_extensions.pth' personnalisé sous' site-packages'. Vous pouvez également mettre à jour la variable d'environnement 'PYTHONPATH' dans le fichier' bin/activate' que vous appelez chaque fois que vous activez l'environnement virtuel. Ou vous pouvez ajouter des liens symboliques sous 'site-packages' pour pointer vers les répertoires supplémentaires. Ces deux alternatives sont plus transparentes pour les outils de ligne de commande traditionnels que les développeurs utilisent largement pour résoudre les problèmes. L'utilisation d'un '.pth' personnalisé avec un nom non documenté, le rend plus magique IMO. –

+0

Essayé d'ajouter à PYTHONPATH dans bin/activer - pas de chance; peut essayer les autres - merci pour la suggestion. Le problème est, j'ai lu les docs à fond et je n'ai rien trouvé dessus. J'ai posté sur SO, personne ne semblait pouvoir aider. Il serait facile que cela se transforme en discussion (je pense que ce serait une bonne chose), mais pour l'instant - mon problème avec la recommandation de venv pour une utilisation générale est que pour nous simples mortels python, il ne semble pas prêt pour prime-time sans un outil équivalent à venvwrapper. Je peux facilement dire à quelqu'un de taper 'add2virtualenv', en les envoyant aux paquets de site, pas tellement. – SteveJ