Комбинация Python venv и virtualenvwrapper

В Python 3.5 рекомендуется создавать виртуальные среды с помощью venv вместо виртуальный_env. Тем не менее, в руководстве по упаковке Python упоминаются оба инструмента.

Однако virtualenvwrapper является рекомендуемым инструментом-оболочкой для использования при использовании virtualenv.

Тогда мои вопросы:

  1. Есть ли способ использовать virtualenvwrapper с venv?
  2. Или можно даже считать, что virtualenvwrapper не нужен из-за venv? (Я не понимаю, как это может быть правдой, поскольку это оболочка, решающая другую проблему)

Изменить: я вижу некоторую путаницу в ответах на мой вопрос. venv — это официальный эквивалент virtualenv в Python, как описано в приведенных выше ссылках. Несколько вопросов о переполнении стека предполагают, что следует использовать venv. Как упоминалось в «дубликате», который вы предложили:

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

Поэтому рекомендуется использовать venv. Но, как следует из этого вопроса, если нужно использовать venv, как можно использовать оболочку, такую ​​как virtualenvwrapper


person user1853417    schedule 22.08.2017    source источник
comment
Возможный дубликат В чем разница между venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv и т. д.?   -  person holdenweb    schedule 23.08.2017
comment
@JBentley, вы совершенно правы в своих предположениях. Я думал, что я ясно, но я думаю, что нет. Рад, что у кого-то получилось :) Еще добавлю, что с введением pipenv этот вопрос уже не так актуален.   -  person user1853417    schedule 06.08.2018
comment
@ user1853417, не могли бы вы объяснить свой вариант использования и рабочий процесс? Мне очень любопытно, почему pipenv в вашем случае эквивалентен venv + virtualenvwrapper. Эти инструменты, pipenv и venv/virtualenv+wrapper, решают две очень разные проблемы.   -  person SwimBikeRun    schedule 08.07.2019


Ответы (3)


Вот обычное, но все же чистое и понятное решение. Добавьте этот скрипт в .bashrc / .bash_profile / .zshrc, это даст вам базовое управление венв.

Кроме того, вы можете расширить сценарий, добавив следующую строку, чтобы он также отображал существующие списки venv.

lsvenv(){
    ls $VENV_HOME
}
person Memin    schedule 27.07.2018
comment
Не отвечает на вопрос. Возможно, все еще полезная информация. Возможно, опубликуйте как комментарий или разверните это до полного ответа и оставьте это как альтернативное решение? - person JBentley; 04.08.2018
comment
В настоящее время я использую этот сценарий, и он весьма полезен для управления виртуальными средами. Хотя я получил два отрицательных голоса, я оставлю это здесь, на случай, если это может помочь другим... - person Memin; 25.09.2018

  1. Есть ли способ использовать virtualenvwrapper с venv?

да. Просто укажите WORKON_HOME в вашем каталоге venvs. Вот что я делаю в своем ~/.zshrc, и я использую сочетание virtualenv (сейчас редко, только для нескольких устаревших потребностей py2) и venv (наиболее распространенный). Я переименовал значение по умолчанию в .venvs, чтобы было ясно, что это в основном venvs Python 3, а не virtualenvs.

# Python Environment Handling
export WORKON_HOME=$HOME/.venvs  # Default name changed from virtualenv to highlight I am using python3 -m venv (aka pyvenv)
export PROJECT_HOME=$HOME/dev
source /usr/local/bin/virtualenvwrapper.sh  # symlinked to /Library/Frameworks/Python.framework/Versions/3.7/bin/virtualenvwrapper.sh
  1. Или можно даже считать, что virtualenvwrapper не нужен из-за venv? (Я не понимаю, как это может быть правдой, поскольку это оболочка, решающая другую проблему)

venv == virtualenv (короче). venv не заменяет virtualenvwrapper по той же причине, по которой virtualenv заменяет его. Ваша догадка на этот счет верна.

  1. Чем это лучше, чем просто создание псевдонима, который является источником активации?

Ну, вам решать, что вам нужно, но я считаю, что virtualenvwrapper с zsh-плагинами virtualenv и virtualenvwrapper довольно хороши и лучше, чем необработанные псевдонимы.

workon очень приятно перечислить все продажи, а затем workon speech_analyzer сразу приступить к делу.

  1. Другие решения?

Вы также можете настроить хуки для активации venvs при смене каталога, но если это то, что вам нужно, и только это, то это, по сути, pipenv. Pipenv великолепен, если это все, что вам нужно. В Pipenv также есть интересная и многообещающая функция lockfile, но она слишком медленная для разработки и слишком незрелая из-за проблем в производстве, чтобы комментировать их в настоящее время.

Но мне никогда не нравилась среда 1:1 для рабочего процесса проекта по тем же причинам, что и здесь: https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-доставляет-очень-мало/. В частности, эти потребности совпадают с моими потребностями в единой среде с несколькими проектами: https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-delivers-very-little/#никола

У меня есть шесть сред на моей машине и около 20 проектов. Pipenv не распространяется на эту ситуацию. Pipenv настаивает на 20 средах для 20 проектов. Это просто не работает и создает больше проблем, чем решает. Если в настоящее время у вас есть рабочий процесс 1: 1, то pipenv может быть тем инструментом, который вам нужен. Одно предостережение: к сожалению, вы можете ~только~ выполнять этот рабочий процесс в pipenv.

person SwimBikeRun    schedule 08.07.2019

[EDIT, 8 июля 19: Читатели, вероятно, обнаружат, что этот ответ дает более полное описание различных инструментов для работы с виртуальными средами в Python. У всех есть свои проблемы, как и у conda, у которой несколько более сложная концепция «окружающей среды».]

  1. Как следует из названия, virtualenvwrapper был специально разработан для переноса virtualenv, от которого он зависит. Я не верю, что кто-то еще так же обернул venv.

  2. venv предназначен для выполнения основной работы по созданию виртуальных сред, но управление средой должно выполняться с помощью сценариев. Хотя сценарии оболочки часто являются первым прибежищем людей, модуль venv имеет обширный API, который поможет вам в этих задачах.

В настоящее время существует множество вариантов создания виртуальных сред Python. Помимо тех, которые вы упомянули, anaconda позволяет создавать среды и управлять ими и даже довольно хорошо работает с pip большую часть времени.

Инструменты в пространстве виртуальной среды были разработаны для совместной работы со стандартными инструментами распространения Python, насколько это возможно, но появление venv в Python 3.5 не сделало недействительным ни virtualenv, ни virtualenvwrapper, которые должны по-прежнему работать нормально.

Модуль venv в основном представляет собой простой набор инструментов, позволяющий создавать виртуальные окружения внутри программ, и ни в коем случае не предназначен для замены удобства virtualenvwrapper. Он просто отвечает несколько иному набору потребностей.

person holdenweb    schedule 22.08.2017
comment
На самом деле этот вопрос дает гораздо больше полное описание проблем. - person holdenweb; 23.08.2017
comment
Я с большей неохотой отклоняю этот ответ, чем другой, потому что он ближе к актуальности, но его можно было бы улучшить, чтобы более полно ответить на вопрос. Из этого ответа неясно, может ли virtualenvwrapper обернуть venv, что, я думаю, является основной проблемой, к которой ведет ОП (см. его пронумерованный вопрос 1). Другими словами, это бинарный выбор между (1) virtualenvwrapper + virtualenv; или (2) venv (без virtualenvwrapper)? Или есть вариант (3) virtualenvwrapper+venv? - person JBentley; 04.08.2018
comment
@JBentley, вы совершенно правы в своих предположениях. Я думал, что я ясно, но я думаю, что нет. Рад, что у кого-то получилось :) Еще добавлю, что с введением pipenv этот вопрос уже не так актуален. - person user1853417; 06.08.2018
comment
pipenv использует virtualenv для достижения своей цели. Так что думаю вопрос virtualenvwrapper + venv все же остается. Но из документов и репозитория virtualenvwrapper я не думаю, что это так. - person meyj; 15.10.2018
comment
@ user1853417 pipenv довольно ужасен, переоценен и не решает ни одной из проблем, которые решают venv и virtualenv. Не рекламируйте его как замену, как это делают многие. Он делает одно, развертывает управление зависимостями, да и то делает это плохо. Я надеюсь, что сообщество Python сможет стандартизировать эти вещи и улучшить ужасные методы упаковки, но до тех пор pipenv не является решением. Используйте venv или virtualenv для разработки, conda/docker для развертывания и pyinstaller для отправки бабушке. chriswarrick.com/blog/2018 /17/07/ - person SwimBikeRun; 08.07.2019