Какова связь между virtualenv и pyenv?

175

Недавно я узнал, как использовать virtualenv и virtualenvwrapper в моем рабочем процессе, но я видел pyenv, упомянутый в нескольких руководствах, но я не могу понять, что такое pyenv и чем он отличается / похож на virtualenv. Является ли pyenv лучшей / более новой заменой для virtualenv или дополнительным инструментом? Если последнее, что он делает по-другому и как оба (и virtualenvwrapper, если применимо) работают вместе?

truth1ness
источник
3
fgimian.github.io/blog/2014/04/20/... : Тем не менее, есть еще одна альтернатива называется pyenv , который имеет ряд существенных преимуществ .
Мартин Питерс
11
Не быть похожим на меня и получить pyenvпутать сpyvenv
User

Ответы:

162

Pyenv и virtualenv - это очень разные инструменты, которые по-разному работают для разных вещей:

  • Pyenv - это расширение bash - не будет работать в Windows - которое перехватывает ваши вызовы python, pip и т. Д., Чтобы направить их в одну из нескольких системных цепочек инструментов python. Таким образом, у вас всегда есть все библиотеки, которые вы установили в выбранной версии Python - как таковой, он хорош для пользователей, которым приходится переключаться между различными версиями Python.

  • VirtualEnv - это чистый python, поэтому он работает везде, он создает копию, необязательно определенной версии, python и pip, локальную для среды активации, которая может включать или не включать ссылки на текущую цепочку инструментов системы, если это невозможно установить только известное подмножество библиотек в эту среду. Таким образом, это почти наверняка намного лучше для тестирования и развертывания, так как вы точно знаете , какие библиотеки, в каких версиях используются, и глобальные изменения не повлияют на ваш модуль.

Venv Python> 3,3

Обратите внимание, что начиная с Python 3.3 и далее существует встроенная реализация VirtualEnv, называемая venv (с, в некоторых установках, оболочкой, называемой pyvenv - эта оболочка устарела в Python 3.6 ), которая, вероятно, должна использоваться в предпочтении. Чтобы избежать возможных проблем с оберткой, часто рекомендуется использовать ее напрямую с помощью /path/to/python3 -m venv desired/env/pathили вы можете использовать отличный pyселектор python в Windows с py -3 -m venv desired/env/path. Он создаст каталог, указанный в desired/env/pathconfigure, и заполнит его соответствующим образом. В целом это очень похоже на использование VirtualEnv.

Дополнительные инструменты

Существует ряд инструментов, о которых стоит упомянуть и которые следует рассмотреть, поскольку они могут помочь в использовании одного или нескольких из перечисленных выше:

  • VirtualEnvWrapper Управление и упрощение использования и управления VirtualEnv - Cross Platform .
  • pyenv-virtualenv , установленный pyenv-installer , который предоставляет инструменты PyEnv для управления и взаимодействия с VirtualEnv - благодаря этому вы можете иметь базовую установку, включающую более одной версии python, и создавать изолированные среды в каждой из них - Linux / OS- X . Предложил Иоганн Визаги
  • PyInstaller может взять ваш код Python, возможно, разработанный и протестированный под VirtualEnv, и объединить его так, чтобы он мог работать на тех платформах, на которых не установлена версия Python. Обратите внимание, что это не кросс-компилятор, вам потребуется Windows (виртуальная). -) машина для сборки установок Windows и т. д., но это может быть удобно, даже если вы можете быть уверены, что Python будет установлен, но не можете быть уверены, что версия python и все библиотеки будут совместимы с вашим кодом.
Стив Барнс
источник
3
Вероятно, стоит упомянуть pyenv-virtualenv, плагин pyenv, который позволяет pyenv и virtualenv беспрепятственно работать в унисон. Если вы установили pyenv с помощью pyenv-installer, pyenv-virtualenv уже будет присутствовать. * Github.com/yyuu/pyenv-virtualenv * github.com/yyuu/pyenv-installer
wjv
1
Как насчет venvтеперь в стандартной библиотеке?
Flimm
@Flimm: Начиная с python 3.3 и далее, venv является частью стандартной библиотеки и должен использоваться вместо virtualenv, поскольку его часто называют «virtualenv сделано правильно» - reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv
Стив Барнс
2
pyenv-virtualenv не является (или, по крайней мере, больше не является) linux. Для этого есть пакет homebrew для простой установки на MacOS.
Поворот
Спасибо, что подчеркнули совместимость!
HashRocketSyntax
16

virtualenvпозволяет создавать пользовательские установки Python, например, в подкаталоге вашего проекта. Таким образом, каждый из ваших проектов может иметь свои собственные python(или даже несколько) под их соответствующим virtualenv. Для некоторых / всех virtualenv совершенно нормально иметь одну и ту же версию python(например, 2.7.16) без конфликтов - они живут отдельно и не знают друг друга. Если вы хотите использовать какой-либо из этих пунктов python, вы должны activateэто сделать (запустив скрипт, который временно изменит ваш файл, PATHчтобы убедиться, что bin/каталог virtualenv стоит первым). С этого момента вызов python(или pipт. Д.) Будет вызывать версию virtualenv до тех пор, пока вы deactivateее не восстановите PATH.

pyenvработает в более широком масштабе, чем virtualenv- он содержит регистр установок Python (и может использоваться для установки новых) и позволяет вам настроить, какую версию Python запускать при использовании pythonкоманды. Звучит похоже, но практическое использование немного другое. Он работает, добавляя свой pythonскрипт- шим к вашему PATH(навсегда), а затем решая, какой «реал» pythonвызывать. Вы даже можете настроить pyenv для вызова одного из ваших питонов virtualenv (используя pyenv-virtualenvплагин). Версии Python, которые вы устанавливаете с помощью, pyenvидут в его $(pyenv root)/versions/каталог (по умолчанию root для pyenv - ~ / .pyenv), поэтому они более «глобальны», чем virtualenv. Обычно вы не можете дублировать версии Python, установленные через pyenv, по крайней мере, это не главная идея.

Чтобы создать virtualenv с определенной версией Python, вам нужно иметь эту версию где-то в вашей системе (независимо от того, PATHвключена она или нет) и по существу клонировать ее в ваш недавно созданный virtualenv. Конечно, один из способов получить определенную версию - это установить ее через pyenv. Как только это будет сделано, отдельные virtualenv могут свободно расходиться, установив в них различные модули (или их версии).

Коротко:

  • virtualenv позволяет создавать локальные, независимые установки Python путем клонирования из существующих
  • pyenv позволяет устанавливать разные версии python одновременно (либо для всей системы, либо только для локального пользователя), а затем выбирать, какой из множества питонов запускаться в любой момент времени (включая те, которые созданы virtualenv или Anaconda)
Блажей Чапп
источник