В чем разница между venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv и т. Д.?

1028

Python 3.3 включает в свою стандартную библиотеку новый пакет venv. Что он делает, и как он отличается от всех других пакетов, которые, кажется, соответствуют регулярному выражению (py)?(v|virtual|pip)?env?

Флимм
источник
21
И чтобы опередить закрытое голосование, я чувствовал, что это более общий вопрос, чем stackoverflow.com/questions/29950300/… , и поэтому мне было неудобно редактировать этот вопрос или публиковать слишком общий ответ в этом сообщении.
Flimm
12
Это руководство и полезно, и постоянно обновляется, так как python продолжает добавлять больше и больше «одного и только одного очевидного способа» делать вещи: docs.python-guide.org/en/latest/dev/virtualenvs
Майкл
2
Начиная с версии 3.6 мне было легче заставить virtualenv работать по сравнению с pyenv на macOS (я - pyNoob)
HashRocketSyntax
@HashRocketSyntax virtualenvи pyenvне выполняют ту же функцию, и не являются альтернативами друг другу. Смотри мой ответ.
Flimm
7
Я сжег весь день, тратя время на пипенв. Суть в том, что он перекуплен. Venv и virtualenv, если вам нужен py2, являются подходящими инструментами. Конда (миниконда, если вам не нужен полный стек) тоже очень хороша. Очень хорошая рецензия
SwimBikeRun

Ответы:

1384

Пакеты PyPI не входят в стандартную библиотеку:

  • virtualenvэто очень популярный инструмент, который создает изолированные среды Python для библиотек Python. Если вы не знакомы с этим инструментом, я настоятельно рекомендую изучить его, так как это очень полезный инструмент, и я буду сравнивать его до конца этого ответа.

    Он работает, устанавливая несколько файлов в каталоге (например:) env/, а затем изменяя PATHпеременную среды, добавляя к ней префикс собственного binкаталога (например:) env/bin/. Точная копия двоичного pythonили python3находится в этом каталоге, но Python запрограммирован для поиска библиотек относительно его пути в каталоге среды. Он не является частью стандартной библиотеки Python, но официально благословлен PyPA (Python Packaging Authority). После активации вы можете устанавливать пакеты в виртуальной среде, используя pip.

  • pyenvиспользуется для изоляции версий Python. Например, вы можете проверить свой код на Python 2.7, 3.6, 3.7 и 3.8, поэтому вам потребуется способ переключения между ними. После активации он префикс PATHпеременной среды ~/.pyenv/shims, где есть специальные файлы, соответствующие командам Python ( python, pip). Это не копии команд Python; это специальные сценарии, которые на лету решают, какую версию Python запускать, основываясь на PYENV_VERSIONпеременной окружения, или .python-versionфайле, или ~/.pyenv/versionфайле. pyenvтакже облегчает процесс загрузки и установки нескольких версий Python с помощью команды pyenv install.

  • pyenv-virtualenvэто плагин для pyenvтого же автора pyenv, что позволяет вам использовать pyenvи virtualenvв то же время удобно. Однако, если вы используете Python 3.3 или более поздней pyenv-virtualenvверсии, попробуйте запустить, python -m venvесли он доступен, вместо virtualenv. Вы можете использовать virtualenvи pyenvвместе без pyenv-virtualenv, если вы не хотите удобных функций.

  • virtualenvwrapperэто набор расширений для virtualenv(см. документы ). Он дает вам такие команды, как mkvirtualenv, lssitepackagesи особенно workonдля переключения между различными virtualenvкаталогами. Этот инструмент особенно полезен, если вам нужно несколько virtualenvкаталогов.

  • pyenv-virtualenvwrapperэто плагин для pyenvтого же автора pyenv, чтобы удобно интегрировать virtualenvwrapperв pyenv.

  • pipenvстремится объединить Pipfile, pipи virtualenvв одну команду в командной строке. virtualenvКаталог , как правило , получает помещается в ~/.local/share/virtualenvs/XXXс XXXбудучи хэш путь директории проекта. Это отличается от того virtualenv, где каталог обычно находится в текущем рабочем каталоге. pipenvпредназначен для использования при разработке приложений Python (в отличие от библиотек). Существуют альтернативы pipenv, такие как poetry, которые я не буду здесь перечислять, поскольку этот вопрос касается только пакетов с одинаковыми именами.

Стандартная библиотека:

  • pyvenvэто скрипт, поставляемый с Python 3, но устарел в Python 3.6, так как у него были проблемы (не говоря уже о запутанном имени). В Python 3.6+ точным эквивалентом является python3 -m venv.

  • venvэто пакет, поставляемый с Python 3, который вы можете запустить с помощью python3 -m venv(хотя по некоторым причинам некоторые дистрибутивы разделяют его на отдельный пакет дистрибутивов, например, в python3-venvUbuntu / Debian). Он служит для той же цели virtualenv, но имеет только подмножество своих функций ( см. Сравнение здесь ). virtualenvпродолжает быть более популярным, чем venv, тем более что первый поддерживает Python 2 и 3.

Рекомендации для начинающих:

Это моя личная рекомендация для начинающих: начните с изучения virtualenvи pipинструментов, которые работают как с Python 2 и 3, так и в различных ситуациях, и подбирайте другие инструменты, как только они вам понадобятся.

Флимм
источник
116
Это очень полезно! Так почему 8 запутанных вещей вместо 1? («Должен быть один - и желательно только один - очевидный способ сделать это». - Дзен Питона)
Jerry101
60
@ Jerry101, введение venv отчасти является ответом на этот беспорядок. Если вы хотите помочь улучшить ситуацию, я предлагаю вам использовать venv и призывать других делать то же самое.
Магнус Линд Окслунд
31
«Внедрение venv отчасти является ответом на этот беспорядок». Почему, когда слишком много вещей, которые делают «что-то вроде X», люди всегда думают, что могут улучшить этот беспорядок, делая другое, что делает «что-то вроде X» , Это довольно забавно на самом деле. Мы сейчас 4 года спустя ... может быть уместно спросить, venvдействительно ли эта проблема решена?
Крис
35
Единственными двумя инструментами в списке, которые действительно охватывают, возможно, одну и ту же территорию, являются virtualenv и venv, поэтому характеристика того, что мы имеем дело с беспорядком, вызванным несколькими конкурирующими инструментами, не очень точна. Список, однако, состоит из нескольких инструментов, связанных с виртуальной средой, все с похожими названиями. Это может сбивать с толку, особенно для пользователей, которые только что узнали о них. Венв улучшил ситуацию? Он действительно предлагал более легкую альтернативу другим инструментам виртуальной среды, извлекая выгоду из собственных модификаций и места в стандартной библиотеке. …
Магнус Линд Окслунд
11
@cowbert После всего лишь обновления с Python 3.5 до Python 3.6 и полного перерыва в работе virtualenvs, похоже, venvвы сможете легче перейти на новую версию Python.
Даниэль Х
277

Я бы просто избегал использования virtualenvпосле Python3.3 + и вместо этого использовал стандартную библиотеку venv. Чтобы создать новую виртуальную среду, вы должны набрать:

$ python3 -m venv <MYVENV>  

virtualenvпытается скопировать двоичный файл Python в каталог bin виртуальной среды. Однако он не обновляет ссылки на библиотечные файлы, встроенные в этот двоичный файл, поэтому, если вы собираете Python из исходного кода в несистемный каталог с относительными именами путей, двоичный код Python разрывается. Поскольку именно так вы делаете копируемый распространяемый Python, это большой недостаток. Кстати, чтобы проверить ссылки на файлы встроенной библиотеки на OS X, используйте otool. Например, в вашей виртуальной среде введите:

$ 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)

Следовательно, я бы избегал virtualenvwrapperи pipenv. pyvenvустарел. pyenvКажется, часто используется там, где virtualenvиспользуется, но я бы держался от этого подальше, так как я думаю, что venvтакже делает то, pyenvдля чего создан.

venvсоздает виртуальные среды в оболочке, которые являются свежими и изолированными , с настраиваемыми пользователем библиотеками и безопасными для нескольких Python . Свежесть, потому что виртуальные среды начинаются только со стандартных библиотек, которые поставляются с Python, вам придется заново устанавливать любые другие библиотеки, pip installпока виртуальная среда активна. Песочница, потому что ни одна из этих новых библиотек не видна за пределами виртуальной среды, поэтому вы можете удалить всю среду и начать заново, не беспокоясь о том, как повлияет на вашу базовую установку Python. Пользовательские библиотеки, потому что целевая папка виртуальной среды создается безsudoв каком-то каталоге у вас уже есть, поэтому вам не понадобятся sudoразрешения для установки в него библиотек. Наконец, он безопасен для нескольких Python , поскольку при активации виртуальных сред оболочка видит только версию Python (3.4, 3.5 и т. Д.), Которая использовалась для создания этой виртуальной среды.

pyenvпохоже на venvто, что позволяет управлять несколькими средами Python. Однако pyenvвы не можете удобно откатить установку библиотеки до некоторого начального состояния, и вам, вероятно, понадобятся adminпривилегии для обновления библиотек. Поэтому я думаю, что это также лучше всего использовать venv.

За последние пару лет я обнаружил много проблем в системах сборки (пакеты emacs, сборщики автономных приложений Python, установщики ...), которые в конечном итоге сводятся к проблемам virtualenv. Я думаю, что Python станет лучшей платформой, если мы исключим эту дополнительную опцию и будем использовать только ее venv.

Риаз Ризви
источник
3
add2virtualenvнастраивает ваш PYTHONPATH, добавив пользовательский _virtualenv_path_extensions.pthфайл в site-packages. В качестве альтернативы вы можете обновить PYTHONPATHпеременную среды в bin/activateфайле, который вы вызываете при каждой активации виртуальной среды. Или вы можете добавить символические ссылки, site-packagesчтобы указать на дополнительные каталоги. Обе эти альтернативы более прозрачны для традиционных инструментов командной строки, которые разработчики широко используют для устранения неполадок. Использование обычая .pthс недокументированным именем делает его более волшебным IMO.
Риаз Ризви
15
Итак, я подтвердил на stackoverflow.com/questions/48130371/… что правильное обновление PYTHONPATHустраняет необходимость add2virtualenv. Что касается отсутствия помощи по SO из вашего первого комментария, мое единственное предложение - ответы upvote, если они решат вашу проблему, чтобы мотивировать людей на устранение неполадок для вас, когда вы публикуете? Полчаса расследования + написание в обмен на щелчок мышью? Звучит как хорошая сделка ...
Риаз Ризви
7
Нет, вы правы - я стараюсь быть вежливым. Черт, если бы вы были в моем районе, я бы купил вам пиво. Я выполню свое обещание и посмотрю, позволят ли разработчики документов на python добавить изменения в / bin / activ для официальных документов для ясности. Хотя я не очень хорош, я не ужасен в питоне. Если мне было тяжело ... В любом случае, спасибо за потраченное время - желаю вам всего наилучшего.
SteveJ
9
@ MalikA.Rumi благословение было немного сокращено до «создателя Pipenv, который старательно продается нам и другим, именно поэтому мы упоминаем Pipenv».
Роб Грант
6
@AndreaMoro Это не pyvenvрекомендуется pyenv. Это так легко спутать с названиями этих инструментов.
Даниэль Холмс
25

Я спустился в pipenvкроличью нору ( это действительно глубокая и темная дыра ... ), и, поскольку последний ответ более 2 лет назад , я счел полезным обновить обсуждение последними разработками по теме виртуальных конвертов Python, которую я нашел.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:

Этот ответ НЕ о продолжении бурных дебатов о преимуществах pipenv по сравнению с venv в качестве решений для конвертов - я не поддерживаю ни того, ни другого . Речь идет о PyPA утверждения конфликтующих стандартов и как развития будущего virtualenv обещания свести на нет , сделав или / или выбор между ними на всех. Я сосредоточился на этих двух инструментах именно потому, что они были помазаны PyPA .

venv

Как отмечает OP, venv - это инструмент для виртуализации сред. НЕ стороннее решение, а нативный инструмент. PyPA Подтверждает venv для создания ВИРТУАЛЬНЫХРЕНТГЕНОВСКИХ КОНВЕРТОВ : « Изменено в версии 3.5: Использование venv теперь рекомендуются использовать для создания виртуальных сред ».

pipenv

pipenv - как и venv - может использоваться для создания виртуальных конвертов, но дополнительно включает функцииуправления пакетами и проверки уязвимостей . Вместо использованияrequirements.txt,pipenvобеспечивает управление пакетамипомощью Pipfile . Как PyPA одобряет pipenv для управления пакетами , которыепредставляется, подразумеваетpipfile, чтобы подменятьrequirements.txt.

ОДНАКО : pipenv использует virtualenv в качестве инструмента для создания виртуальных конвертов, а НЕ venv, который одобрен PyPA в качестве инструмента для создания виртуальных конвертов.

Противоречивые стандарты:

Таким образом, если решение с виртуальной оболочкой было недостаточно сложным, у нас теперь есть PyPA, поддерживающая два разных инструмента, которые используют разные решения с виртуальной оболочкой. Яростные дебаты Github о venv vs virtualenv, которые подчеркивают этот конфликт, можно найти здесь .

Решение конфликта:

Дискуссия о Github, на которую ссылается вышеупомянутая ссылка, направила развитие virtualenv в направлении размещения venv в будущих выпусках :

предпочитаем встроенный venv: если у целевого питона есть venv, мы создадим среду, используя это (и затем выполним последующие операции над этим, чтобы облегчить другие гарантии, которые мы предлагаем)

Вывод:

Похоже, что в будущем между двумя конкурирующими решениями с виртуальными конвертами произойдет сближение, но на данный момент pipenv - который использует virtualenv- существенно отличается от venv.

Учитывая проблемы, которые решает pipenv, и тот факт, что PyPA дал свое благословение, у него, похоже , светлое будущее. И если virtualenv справляется с поставленными задачами развития, выбор решения с виртуальной оболочкой больше не должен рассматриваться как pipenv ИЛИ venv .

F1Linux
источник
6
Из того, что я понял: реальная стоимость pipenv уже обсуждалась уже некоторое время и не выпускалась более года. С тех пор многое изменилось, и я бы сказал, что для pipenv стало только хуже (такие инструменты, как поэзия и pip-инструменты находятся в гораздо лучшей форме). В PyPA страницы устарели, и я бы сказал , что они должны разжаловать pipenv . Venv является стандартным инструментом и поэтому очень эффективен, но имеет ограниченный набор функций. virtualenv не конкурирует с venv, но пытается охватить области, где venv не может или не хочет идти (так как это стандарт).
sinoroc
@sinoroc Мой пост был не о достоинствах или pipenv. Он был о противоречивом руководстве PyPA, одобрившем и pipenv, и venv, усложняющем выбор решения для конвертов, и то, как оно выглядит, некоторая степень конвергенции сведет на нет необходимость выбора между ними вообще. Обратите внимание, что я ничего не одобряю, просто поделился тем, что я узнал о том, как развиваются эти два решения, одобренные PyPA . Учитывая интерес PyPA в них, независимо от того , как я их или не становится неуместной: pipenv и venv казалось , скорее всего , станет частью ландшафта
F1Linux
9
Я бы сказал, придерживайтесь Venv и пип как можно больше. Эти два здесь, чтобы остаться, venv является частью стандартной библиотеки Python и в некотором смысле pip, так как он продается в Python (через surepip ). Другие инструменты (за исключением серии pyenv : совершенно разные вещи), похоже, либо полагаются, либо подражают (с большим или меньшим успехом) venv и pip . Что здорово. Но если что-то пойдет не так, venv и pip - безопасный запасной вариант. Единственный другой инструмент, который я использую, это toxtox-venv), чтобы помочь создать и заполнить виртуальные среды (просто, без магии, странно, это еще не упомянуто).
sinoroc
3
Этот последний пост - золото, так как он отлично справился с разглаживанием морщин. Я придерживаюсь pip и venv, так как у меня были проблемы с висящими двоичными файлами, использующими virtualenv, когда был обновлен системный python.
Codeviper
1
В прошлом у меня возникали проблемы с невербальной pipenv на ошибках. Аргл и Кювет. Также: chriswarrick.com/blog/2018/07/17/…
qrtLs
4

Апрель 2020 Обновление

Я искал то же самое, когда наткнулся на этот пост . Я думаю, что вопрос о том, какой инструмент использовать, довольно запутан и труден для новых пользователей Python, таких как я. Это прямо с сайта PyPA относительно pipenv:

Хотя в этом руководстве рассматривается проект pipenv как инструмент, ориентированный в первую очередь на разработку приложений Python, а не на разработку библиотек Python, сам проект в настоящее время решает несколько проблем, связанных с процессами и обслуживанием, которые не позволяют публиковать исправления ошибок и новые функции ( со всей 2019 года прохождения без нового релиза). Это означает, что в ближайшей перспективе pipenv по-прежнему страдает от нескольких причуд и проблем с производительностью без четких сроков разрешения этих проблем.

Хотя это по-прежнему актуально, разработчики проектов, вероятно, захотят исследовать другие инструменты для управления зависимостями приложений для использования вместо или вместе с pipenv.

Если предположить, что выпуск pipenv в апреле 2020 года будет идти в соответствии с планом, а выпуск после этого также будет продолжен, то это предостережение в руководстве будет удалено. Если эти выпуски не будут продолжены, то само учебное пособие будет удалено и заменено страницей обсуждения доступных параметров управления зависимостями.

Arnuld
источник
Похоже, что pipenv в настоящее время (то есть в мае 2020 года) все еще находится в предварительной версии для выпуска в апреле 2020 года. Смотрите здесь .
andrewjames
Это не отвечает на вопрос.
Флим
Я думаю, @Flimm хорошо ответил на вопросы. Я отвечал на ответ
F1Linux
1
По состоянию на 4 июня 2020 года pipenvгруппу выпустила 2 версии для PyPI: 2020.5.28и совсем недавно 2020.6.2: pypi.org/project/pipenv/#history
небытия