Python 3.3 включает в свою стандартную библиотеку новый пакет venv
. Что он делает и как он отличается от всех других пакетов, которые, похоже, соответствуют регулярному выражению (py)?(v|virtual|pip)?env
?
В чем разница между venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv и т.д.?
Ответ 1
Пакеты PyPI не входят в стандартную библиотеку:
-
virtualenv
- очень популярный инструмент, который создает изолированные среды Python для библиотек Python. Если вы не знакомы с этим инструментом, я настоятельно рекомендую изучить его, так как это очень полезный инструмент, и я буду сравнивать его с остальной частью этого ответа.Он работает, устанавливая кучу файлов в каталоге (например:
env/
), а затем изменяяPATH
средыPATH
чтобы префикс ее с помощью специального каталогаbin
(например:env/bin/
). Точная копия двоичногоpython3
python
илиpython3
помещается в этот каталог, но Python запрограммирован на поиск библиотек по отношению к первому пути в каталоге среды. Он не является частью стандартной библиотеки Python, но официально благословлен PyPA (Python Packaging Authority). После активации вы можете устанавливать пакеты в виртуальной среде с помощьюpip
. -
pyenv
используется для изоляции версий Python. Например, вы можете протестировать свой код на Python 2.6, 2.7, 3.3, 3.4 и 3.5, так что вам понадобится способ переключения между ними. После активации он~/.pyenv/shims
PATH
средыPATH
с помощью~/.pyenv/shims
, где есть специальные файлы, соответствующие командам Python (python
,pip
). Это не копии команд, отгруженных Python; это специальные скрипты, которые на лету решают, какую версию Python запускать наPYENV_VERSION
переменной средыPYENV_VERSION
, или.python-version
, или файла~/.pyenv/version
.pyenv
также упрощает процесс загрузки и установки нескольких версий Python, используя командуpyenv install
. -
pyenv-virtualenv
- это плагин дляpyenv
того же автора, что иpyenv
, чтобы вы могли одновременно использоватьpyenv
иvirtualenv
. Однако, если вы используете Python 3.3 или более позднейpyenv-virtualenv
,pyenv-virtualenv
попытается запуститьpython -m venv
если он будет доступен, а неvirtualenv
. Вы можете использоватьvirtualenv
иpyenv
вместе безpyenv-virtualenv
, если вы не хотите удобных функций. -
virtualenvwrapper
- это набор расширений дляvirtualenv
(см. документы). Он дает вам команды вродеmkvirtualenv
,lssitepackages
и особенноworkon
для переключения между различными каталогамиvirtualenv
. Этот инструмент особенно полезен, если вам нужно несколько каталоговvirtualenv
. -
pyenv-virtualenvwrapper
- это плагин дляpyenv
того же автора, что иpyenv
, чтобы удобно интегрироватьvirtualenvwrapper
вpyenv
. -
pipenv
, автор Kenneth Reitz (авторrequests
), является самым новым проектом в этом списке. Он предназначен для объединенияPipfile
,pip
иvirtualenv
в одну команду в командной строке. Каталогvirtualenv
обычно помещается в~/.local/share/virtualenvs/XXX
, причемXXX
является хешем пути каталога проекта. Это отличается отvirtualenv
, где каталог обычно находится в текущем рабочем каталоге.В Python Packaging Guide рекомендуется
pipenv
приложения для разработки приложений Python (в отличие от библиотек). Кажется, что нет никаких планов по поддержкеvenv
вместоvirtualenv
(# 15). Смутно, его параметр командной строки--venv
относится к каталогуvirtualenv
, а неvenv
, и аналогично переменная окруженияPIPENV_VENV_IN_PROJECT
влияет на местоположение каталогаvirtualenv
, а не на каталогvenv
(# 1919).
Стандартная библиотека:
-
pyvenv
- это сценарий, поставляемый с Python 3, но устаревший в Python 3.6, поскольку у него были проблемы (не говоря уже о запутанном имени). В Python 3. 6+ точным эквивалентом являетсяpython3 -m venv
. -
venv
- это пакет, поставляемый с Python 3, который вы можете запускать с помощьюpython3 -m venv
(хотя по некоторым причинам некоторые дистрибутивы разделяют его на отдельный дистрибутив, такой какpython3-venv
на Ubuntu/Debian). Он служит аналогичной цели дляvirtualenv
и работает очень схожим образом, но ему не нужно копировать двоичные файлы Python (кроме Windows). Используйте это, если вам не нужно поддерживать Python 2. На момент написания письма сообщество Python, похоже, было довольнымvirtualenv
и я не слышал много разговоров оvenv
.
Большинство этих инструментов дополняют друг друга. Например, pipenv
интегрирует pip
, virtualenv
и даже pyenv
если это необходимо. Единственными инструментами, которые являются истинными альтернативами друг другу, являются venv
и virtualenv
.
Рекомендация для начинающих:
Это моя личная рекомендация для начинающих: начните с изучения virtualenv
и pip
, инструментов, которые работают как с Python 2 и 3, так и в самых разных ситуациях, и возьмите другие инструменты, как только начнете их использовать.
Ответ 2
Я бы просто избегал использования virtualenv
после Python3. 3+ и вместо этого использовал стандартную отправленную библиотеку venv
. Чтобы создать новую виртуальную среду, введите:
$ python3 -m venv <MYVENV>
virtualenv
пытается скопировать двоичный файл Python в каталог виртуальной среды bin. Однако он не обновляет ссылки на файлы библиотек, встроенные в этот двоичный файл, поэтому, если вы создаете Python из исходного кода в несистемный каталог с относительными именами путей, бинар Python прерывается. Так как вы делаете копию распространяемого Python, это большой недостаток. BTW для проверки ссылок на встроенные библиотеки файлов на 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
подальше от него, так как я думаю, что venv
также делает то, для чего pyenv
.
venv
создает виртуальные среды в оболочке, которые являются свежими и изолированными, с устанавливаемыми пользователем библиотеками, и это безопасно для нескольких питонов. Свежий, потому что виртуальные среды начинаются только со стандартных библиотек, которые поставляются с python, вам нужно снова установить любые другие библиотеки с pip install
пока виртуальная среда активна. Песочница, потому что ни одна из этих новых установочных библиотек не виден вне виртуальной среды, поэтому вы можете удалить всю среду и начать заново, не беспокоясь о влиянии на базовую установку python. Устанавливаемые пользователем библиотеки, потому что целевая папка виртуальной среды создается без sudo
в некотором каталоге, который у вас уже есть, поэтому вам не понадобятся разрешения sudo
для установки в него библиотек. Наконец, он безопасен с несколькими питонами, поскольку при активации виртуальных сред оболочка видит только версию python (3.4, 3.5 и т.д.), Которая была использована для создания этой виртуальной среды.
pyenv
похож на venv
поскольку он позволяет управлять несколькими средами python. Однако с pyenv
вы не можете удобно pyenv
библиотечную установку до некоторого состояния запуска, и вам, скорее всего, понадобятся права admin
в какой-то момент для обновления библиотек. Поэтому я считаю, что лучше всего использовать venv
.
За последние пару лет я обнаружил множество проблем в системах сборки (пакеты emacs, автономные разработчики приложений python, установщики...), которые в конечном итоге сводятся к проблемам с virtualenv
. Я думаю, что python станет лучшей платформой, когда мы устраним эту дополнительную опцию и venv
использовать только venv
.
Ответ 3
Python Docs рекомендует использовать venv поверх pyenv. Из документов:
Примечание. Начиная с версии Python 3.6 сценарий pyvenv устарел, поскольку в нем используется python3 -m venv, чтобы предотвратить возможную путаницу в отношении того, на каком интерпретаторе Python будет основана виртуальная среда.