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

Python 3.3 inclut dans sa bibliothèque standard le nouveau paquet venv . Ce qu'il fait, et comment est-il différent de tous les autres paquets qui semblent correspondre à l'expression rationnelle (py)?(v|virtual|pip)?env ?

369
demandé sur Flimm 2017-01-10 19:27:43

2 réponses

paquets PyPI ne figurant 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 vous recommande fortement d'apprentissage, comme c'est un outil très utile, et je vais faire des comparaisons pour le reste de cette réponse.

    Il fonctionne par l'installation d'un tas des fichiers dans un répertoire (par exemple: env/ ), puis la modification de la variable d'environnement PATH pour la 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 chercher les bibliothèques relatives à son chemin en premier, dans le répertoire d'environnement. Il ne fait pas partie de la bibliothèque standard de Python, mais est officiellement béni par le PyPA (Python Packaging Authority). Une fois activé, vous pouvez installer des paquets dans l'environnement virtuel en utilisant pip .

  • pyenv est utilisé pour isoler les versions Python. Par exemple, vous pouvez vouloir tester votre code contre python 2.6, 2.7, 3.3, 3.4 et 3.5, donc vous aurez besoin d'un moyen de passer entre eux. Une fois activé, il préfixe la variable d'environnement PATH à ~/.pyenv/shims , où il existe des fichiers spéciaux correspondant à la Commandes Python( python , pip ). Ce ne sont pas des copies des commandes envoyées par Python; ce sont des scripts spéciaux qui décident à la volée quelle version de Python exécuter basée sur la variable d'environnement PYENV_VERSION , ou le fichier .python-version , ou le fichier ~/.pyenv/version . pyenv facilite également le téléchargement et l'installation de plusieurs versions de Python, en utilisant 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 dans le même temps, confortablement. Cependant, si vous utilisez Python 3.3 ou plus tard, pyenv-virtualenv essaiera 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 à virtualenv (voir docs ). Il vous donne des commandes comme mkvirtualenv , lssitepackages , et surtout workon pour passer 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 , pour intégrer commodément virtualenvwrapper dans pyenv .

  • pipenv , par Kenneth Reitz (l'auteur de requests ), est le plus récent projet de cette liste. Il vise à combiner Pipfile , pip et virtualenv en une seule commande sur la ligne de commande. Le Le répertoire virtualenv est généralement placé dans ~/.local/share/virtualenvs/XXX , avec XXX étant un hachage du chemin du répertoire du projet. C'est différent de virtualenv , où le répertoire est typiquement dans le répertoire courant.

    Le Python de l'Emballage Guide de l' recommande pipenv lors de l'élaboration de Applications Python (par opposition aux bibliothèques). Il ne semble pas y être des plans pour soutenir venv au lieu de virtualenv ( #15 ). Son option en ligne de commande --venv fait référence à la virtualenv répertoire, pas venv , et de même, l'environnement la variable PIPENV_VENV_IN_PROJECT affecte l'emplacement du virtualenv répertoire, pas venv répertoire ( #1919 ).

bibliothèque Standard:

  • pyvenv est un script envoyé avec Python 3 mais déprécié en Python 3.6 car il avait des problèmes (sans mentionner le nom confus). En Python 3.6+, l'équivalent exact est python3 -m venv .

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

la plupart de ces outils se complètent. Par exemple, pipenv intègre pip , virtualenv et même pyenv si vous le souhaitez. Les seuls outils qui sont de véritables alternatives les uns aux autres ici sont venv et virtualenv .

recommandation pour les débutants:

C'est ma recommandation personnelle pour les débutants: commencez par apprendre virtualenv et pip , des outils qui fonctionnent à la fois avec Python 2 et 3 et dans une variété de situations, et ramassez les autres outils Une fois que vous démarrez besoin d'eux.

572
répondu Flimm 2018-04-12 08:48:49

j'éviterais simplement l'utilisation de virtualenv après Python3.3 + et à la place utiliser la bibliothèque standard expédiée venv . Pour créer un nouvel environnement virtuel, 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 construisez Python à partir de la source dans un répertoire non-système avec des noms de chemin relatifs, Le Python binaire des pauses. Puisque C'est ainsi que vous faites une copie distribuable Python, c'est un gros défaut. BTW pour inspecter incorporé le fichier de bibliothèque de liens sur OS X, utilisez otool . Par exemple, dans 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 virtualenvwrapper et pipenv . pyvenv est déprécié. pyenv semble être utilisé souvent où virtualenv est utilisé, mais je voudrais rester loin de lui aussi car je pense que venv fait aussi ce que pyenv est construit pour.

venv crée des environnements virtuels dans le shell qui sont fresh et sandboxed , avec bibliothèques installables par l'utilisateur , et c'est multi-python safe . Fresh parce que les environnements virtuels ne commencent qu'avec les bibliothèques standards qui sont livrées avec python, vous devez installer toutes les autres bibliothèques à nouveau avec pip install alors que l'environnement virtuel est actif. Sandboxed parce qu'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 d'impacter votre installation de base python. bibliothèques installables par L'utilisateur parce que le dossier cible de l'environnement virtuel est créé sans sudo dans un répertoire que vous possédez déjà, donc vous n'aurez pas besoin sudo permet d'y installer des bibliothèques. Enfin c'est multi-python safe , car lorsque les environnements virtuels s'activent, l'interpréteur de commandes ne voit que la version python (3.4, 3.5 etc.) qui a été utilisé pour construire cet environnement virtuel.

pyenv est similaire à venv en ce qu'il vous permet de gérer plusieurs environnements python. Cependant avec pyenv vous ne pouvez pas facilement rollback bibliothèque installe à un certain état de départ et vous aura probablement besoin des privilèges admin à un moment donné 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 python autonomes, installateurs...) qui se résument finalement à des problèmes avec virtualenv . Je pense que python sera une meilleure plate-forme lorsque nous éliminons cette option supplémentaire et utiliser uniquement venv .

80
répondu Riaz Rizvi 2018-02-21 18:25:50