web-dev-qa-db-fra.com

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

Python 3.3 inclut dans sa bibliothèque standard le nouveau paquetage 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?

715
Flimm

Les paquets PyPI ne sont 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 de l'apprendre, car c'est un outil très utile, et je vais faire des comparaisons avec cet outil pour la suite de cette réponse.

    Cela fonctionne en installant un tas de fichiers dans un répertoire (par exemple: env/), puis en modifiant la variable d'environnement PATH pour la préfixer d'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 les bibliothèques relatives à son chemin d’abord, dans le répertoire environment. Cela 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.

  • pyenv est utilisé pour isoler les versions 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ù se trouvent des fichiers spéciaux correspondant aux commandes Python (python, pip). Ce ne sont pas des copies des commandes livrées 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 processus de téléchargement et d'installation de plusieurs versions de Python, à l'aide de la commande pyenv install.

  • pyenv-virtualenv est un plugin pour pyenv du même auteur que pyenv, afin de vous permettre d'utiliser pyenv et virtualenv en même temps de manière pratique. Toutefois, si vous utilisez Python 3.3 ou version ultérieure, pyenv-virtualenv tentera 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 souhaitez pas utiliser les fonctionnalités pratiques.

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

  • pyenv-virtualenvwrapper est un plugin pour pyenv du même auteur que pyenv, pour intégrer facilement virtualenvwrapper à pyenv.

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

    Le Python Guide de packaging recommande pipenv lors du développement d'applications Python (par opposition aux bibliothèques). Il ne semble pas y avoir de plans pour supporter venv au lieu de virtualenv ( # 15 ). De manière confuse, son option de ligne de commande --venv fait référence au répertoire virtualenv et non pas à venv. De même, la variable d'environnement PIPENV_VENV_IN_PROJECT affecte l'emplacement du répertoire virtualenv et non pas venv ( # 1919 ).

Bibliothèque standard:

  • pyvenv est un script livré avec Python 3 mais obsolète dans Python 3.6 car il rencontrait des problèmes (pas mentionner le nom déroutant). Dans Python 3.6+, l'équivalent exact est python3 -m venv.

  • venv est un paquet livré avec Python 3, que vous pouvez exécuter à l'aide de python3 -m venv (bien que, pour une raison quelconque, certaines distributions le séparent dans un paquet de distribution séparé, tel que python3-venv sur Ubuntu/Debian). Il remplit un objectif similaire à virtualenv et fonctionne de manière très similaire, mais il n’est pas nécessaire de copier les fichiers binaires Python (sauf sous Windows). Utilisez ceci si vous n'avez pas besoin de supporter Python 2. Au moment de la rédaction de cet article, la communauté Python semble être satisfaite de virtualenv et je n'ai pas beaucoup entendu 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. venv et virtualenv sont les seuls outils qui constituent de véritables alternatives.

Recommandation pour les débutants:

C’est ma recommandation personnelle pour les débutants: commencez par apprendre virtualenv et pip, des outils fonctionnant à la fois avec Python 2 et 3 et dans diverses situations, puis choisissez les autres outils dès que vous en aurez besoin.

1047
Flimm

Je voudrais simplement éviter d'utiliser virtualenv après Python3.3 + et utiliser à la place la bibliothèque standard livré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 fichier de bibliothèque incorporés dans ce binaire. Par conséquent, si vous construisez Python à partir de la source dans un répertoire non système avec des noms de chemin relatifs, le Python binaire rompt. Puisque c’est ainsi que vous créez une copie distribuable en Python, c’est un gros défaut. BTW pour inspecter les liens de fichiers de bibliothèque incorporés sous 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, je voudrais éviter virtualenvwrapper et pipenv. pyvenv est obsolète. pyenv semble être souvent utilisé là où virtualenv est utilisé, mais je le ferais aussi, car je pense que venv fait également ce pour quoi pyenv est conçu.

venv crée des environnements virtuels dans le shell qui sont frais et bac à sable, avec bibliothèques installables par l'utilisateur, et c'est multi-python safe. Fresh Les environnements virtuels ne commençant que par 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 tout l'environnement et recommencer sans craindre aucun impact sur 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, car lors de l’activation des environnements virtuels, le shell ne voit que la version python (3.4, 3.5, etc.) utilisée pour créer cet environnement virtuel.

pyenv est similaire à venv en ce sens qu'il vous permet de gérer plusieurs environnements python. Cependant, avec pyenv, vous ne pouvez pas restaurer facilement les bibliothèques installées à un état de départ 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.

Ces dernières années, j'ai rencontré de nombreux problèmes dans les systèmes de construction (packages emacs, python générateurs d'applications autonomes, installateurs ...) qui ont finalement abouti à 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.

182
Riaz Rizvi