В чем разница между venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv и другими?
Python 3.3 включает в свою стандартную библиотеку новый пакет venv
. Что он делает и как отличается от других пакетов, подходящих под регулярное выражение (py)?(v|virtual|pip)?env
?
2 ответ(ов)
pyenv – это инструмент для управления различными версиями Python.
Все остальные – это инструменты для создания виртуальных сред, которые обеспечивают изолированную версию Python и установленный пакет "requirements".
pipenv стремится объединить возможности всех этих инструментов, и, кроме того, он устанавливает "requirements" (в активную виртуальную среду или создаёт свою, если никакая не активна).
Поэтому, возможно, вам будет достаточно использовать только pipenv.
Лично я использую: pyenv + pyenv-virtualenvwrapper + pipenv (последний только для установки зависимостей).
На Debian:
Установите необходимые зависимости:
apt install libffi-dev
Установите pyenv, следуя инструкциям на tecmint.com. Но…
Вместо pyenv-virtualenv установите pyenv-virtualenvwrapper (он может быть как отдельной библиотекой, так и плагином для pyenv, здесь мы используем второй вариант):
$ pyenv install 3.9.0 $ git clone https://github.com/pyenv/pyenv-virtualenvwrapper.git $(pyenv root)/plugins/pyenv-virtualenvwrapper # в ~/.bashrc добавьте: # export VIRTUALENVWRAPPER_PYTHON="/usr/bin/python3" $ source ~/.bashrc $ pyenv virtualenvwrapper
После этого создайте виртуальные среды для ваших проектов (каталог рабочего пространства должен существовать):
pyenv local 3.9.0 # чтобы избежать ошибки 'интерпретатор не найден' в mkvirtualenv
python -m pip install --upgrade pip setuptools wheel
mkvirtualenv <venvname> -p python3.9 -a <workingdir>
И переключайтесь между проектами:
workon <venvname>
python -m pip install --upgrade pip setuptools wheel pipenv
В каждом проекте у меня есть файл requirements.txt
, в котором нет жесткой привязки версий (если нет необходимости в ограничении версий). У вас есть два возможных инструмента для установки зависимостей в текущую виртуальную среду: pip-tools или pipenv. Предположим, вы будете использовать pipenv:
pipenv install -r requirements.txt
Это создаст файлы Pipfile
и Pipfile.lock
, фиксированные версии будут во втором из них. Если вы хотите переустановить точно такие же версии где-то, то (файл Pipfile.lock
должен быть на месте):
pipenv install
Помните, что Pipfile.lock
связан с определенной версией Python и его нужно пересоздавать, если вы используете другую.
Как видите, я использую requirements.txt
, что имеет свои проблемы: вам нужно также удалить отсутствующий пакет из Pipfile
. Поэтому, возможно, лучше писать сразу в Pipfile
.
Таким образом, можно сказать, что я довольно плохо использую pipenv. Может быть, если вы освоите его лучше, он сможет заменить всё?
EDIT 2021.01: Я изменил свой стек на: pyenv + pyenv-virtualenvwrapper + poetry
. То есть, я больше не использую установку virtualenv или virtualenvwrapper через apt или pip, а вместо этого устанавливаю плагин pyenv
– pyenv-virtualenvwrapper
. Это гораздо удобнее.
Poetry
отличный для меня:
poetry add <package> # установка одного пакета
poetry remove <package>
poetry install # если вы удалите poetry.lock, poetry пересчитает версии
Я хочу добавить в этот список docker
, а также conda
, которые уже упоминались в нескольких ответах.
conda
более тяжеловесен, чем виртуальные окружения, о которых идет речь в заголовке. Однако он обеспечивает изоляцию некоторых системных инструментов Python, таких как ffmpeg или драйверы GPU.
docker
еще лучше, так как предоставляет целую новую ОС для работы. С помощью хорошо составленного Dockerfile и скриптов docker build
и docker run
вы получаете отличную документацию о том, как ваше окружение создается, и легко можете переносить его в другие среды (стейджинг, продакшн, облако). Это даст вам преимущества в долгосрочной перспективе.
Еще один момент: PyCharm предлагает несколько вариантов для выбора вашего виртуального окружения. Это помогает новичкам не беспокоиться об этой задаче. Рекомендую использовать его, прежде чем вы полностью поймете, что такое виртуальное окружение.
Как выйти/деактивировать виртуальное окружение Python?
Как удалить все пакеты, установленные через pip?
Как обновить pip изнутри виртуального окружения?
Почему используется string.join(list), а не list.join(string)?
Создание словаря с помощью генератора словарей