Куда в virtualenv идет собственный код?

107

Какой структуре каталогов следует придерживаться при использовании virtualenv? Например, если бы я создавал приложение WSGI и создал виртуальную среду с именем, foobarя бы начал с такой структуры каталогов, как:

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}

Как только эта среда будет создана, где можно разместить свою собственную:

  • файлы python?
  • статические файлы (изображения и т. д.)?
  • "нестандартные" упаковки, такие как те, что доступны в Интернете, но не продаются в сырном магазине?

по отношению к virtualenvкаталогам?

(Предположим, я уже знаю, куда должны идти сами каталоги virtualenv .)

Филлип Б. Олдхэм
источник
8
@jkp: Я не согласен. То, как вы размещаете приложение на Python, отличается от того, как вы размещаете это приложение в virtualenv для целей разработки. Это связано, но не одно и то же. Пожалуйста, не закрывайте как дубликат.
jcdyer

Ответы:

90

virtualenvпредоставляет экземпляр интерпретатора Python, а не экземпляр приложения. Обычно вы не создаете файлы своего приложения в каталогах, содержащих системный Python по умолчанию, также нет необходимости размещать свое приложение в каталоге virtualenv.

Например, у вас может быть проект, в котором несколько приложений используют один и тот же файл virtualenv. Или вы можете тестировать приложение с помощью virtualenv, которое позже будет развернуто с системным Python. Или вы можете упаковывать автономное приложение, в котором может иметь смысл разместить каталог virtualenv где-то внутри самого каталога приложения.

Так что в целом я не думаю, что есть один правильный ответ на этот вопрос. И что хорошо, так virtualenvэто то, что он поддерживает множество различных сценариев использования: не обязательно должен быть один правильный путь.

Нед Дейли
источник
8
Согласовано. Я использую virtualenv для всего, что делаю, и никогда не помещаю файлы в каталог virtualenv. Virtualenv не обязательно влияет на структуру вашего проекта; просто активируйте virtualenv (или используйте его bin / python) и работайте со своими файлами, где бы они ни были.
Карл Мейер,
Я также полностью согласен. Единственный раз , когда я когда - либо трогать любые файлы внутри моего virtualenv (использование I virtualenvwrapper), когда я хочу , чтобы редактировать postactivateи postdeactivateкрючки.
Тейн Бримхолл,
Вопрос будет лучше дополнен конкретными практическими примерами различных вариантов, включая компромиссы, как видно из других ответов на этот вопрос.
Andyfeller 08
2
Чисто хранить ваш проект отдельно от virtualenvкаталога, но сравнение virtualenvс системным python бесполезно, потому что цель virtualenvсостоит в том, чтобы исправить сломанные зависимости и изолировать проекты, чтобы они могли использовать разные версии пакетов и даже версии python (я понимаю, что это было написано заранее -python3). Разрешение приложениям делиться a virtualenvиспользуется так, virtualenvкак если бы это был системный Python, оставляя приложения уязвимыми для тех же проблем, для решения которых предназначен virtualenv. There should be one obvious way to do it; по логике должно быть 1: 1
Давос
@Ned: Пытаюсь усвоить передовой опыт, но все еще неясно: если у вас есть десятки проектов, каждый со своим собственным virtualenv, то как вы отслеживаете, какой проект используется с каким virtualenv? Добавить крошечные сценарии оболочки в корень каждой папки с именем virtualenv, с которым вы его используете?
ccpizza
57

Если время от времени у вас всего несколько проектов, ничто не мешает вам создать новый virtualenv для каждого и разместить свои пакеты прямо внутри:

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
  /mypackage1
    __init__.py
  /mypackage2
    __init__.py

Преимущество этого подхода в том, что вы всегда можете быть уверены, что найдете внутри проекта скрипт активации.

$ cd /foobar
$ source bin/activate
$ python 
>>> import mypackage1
>>>

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

  /virtualenvs
    /foobar
      /bin
        {activate, activate.py, easy_install, python}
      /include
        {python2.6/...}
      /lib
        {python2.6/...}
  /foobar
    /mypackage1
      __init__.py
    /mypackage2
      __init__.py

Таким образом, вы всегда можете начать с новой виртуальной машины, когда что-то пойдет не так, и ваши файлы проекта останутся в безопасности.

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

$ cd /foobar
$ source ../virtualenvs/foobar/bin/activate
$ python 
>>> import mypackage2
>>>

Для пользователей, которым регулярно приходится устанавливать и удалять virtualenvs, имеет смысл взглянуть на virtualenvwrapper.

http://pypi.python.org/pypi/virtualenvwrapper

С помощью virtualenvwrapper вы можете

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments

Вам больше не нужно беспокоиться о том, где находятся ваши виртуальные объекты при работе над проектами "foo" и "bar":

  /foo
    /mypackage1
      __init__.py
  /bar
    /mypackage2
      __init__.py

Вот как вы начинаете работу над проектом "foo":

$ cd foo
$ workon
bar
foo
$ workon foo
(foo)$ python
>>> import mypackage1
>>>

Затем переключиться на «панель» проекта очень просто:

$ cd ../bar
$ workon bar
(bar)$ python
>>> import mypackage2
>>>

Довольно здорово, не правда ли?

Майк Рёдер
источник
Я полностью согласен с этим ответом об использовании virtualenvwrapper. Он аккуратно абстрагирует виртуальные возможности, сохраняя при этом все преимущества.
Тейн Бримхолл,
5
Но категорически не согласен с тем, чтобы ВСЕГДА помещать ваш код в виртуальную среду. Если вы хотите, чтобы он находился «рядом» с проектом в файловой системе, поместите venv/каталог на тот же уровень, что и проект BASE_DIR.
Роб Грант
30

Поскольку файлы virtualenv не могут быть перемещены, на мой взгляд, размещение файлов проекта в каталоге virtualenv - плохая практика. Сам virtualenv - это сгенерированный артефакт разработки / развертывания (вроде как файл .pyc), а не часть проекта; должно быть легко удалить его и воссоздать в любое время или создать новый на новом хосте развертывания и т. д.

На самом деле многие люди используют virtualenvwrapper , который практически полностью удаляет фактические virtualenvs из вашего поля зрения, по умолчанию помещая их все рядом в $ HOME / .virtualenvs.

Карл Мейер
источник
Полностью согласен, что это плохая практика, приятно отметить, что ее должно быть легко удалить и воссоздать, особенно для тестирования развертываний и удаления ненужных пакетов требований. Просто хочу добавить , что virtualenv можно передислоцировать с использованием , например , virtualenv --relocatable myvenvувидеть stackoverflow.com/a/6628642/1335793 только потому , что вы можете не означает , что вы должны хотя.
Давос
2

Если вы дадите своему проекту a setup.py, pip может напрямую импортировать его из системы контроля версий.

Сделайте что-нибудь вроде этого:

$ virtualenv --no-site-packages myproject
$ . myproject/bin/activate
$ easy_install pip
$ pip install -e hg+http://bitbucket.org/owner/myproject#egg=proj

Он -eпоместит проект myproject/src, но свяжет его myproject/lib/pythonX.X/site-packages/, поэтому любые внесенные вами изменения будут немедленно приняты в модулях, которые импортируют его из вашего локального site-packages. #eggНемного говорит Пип , что имя , которое вы хотите дать пакет яиц он создает для вас.

Если вы не используете --no-site-packages, будьте осторожны, чтобы указать, что вы хотите установить pip в virtualenv с -Eопцией

jcdyer
источник