2009-11-23 4 views
82

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

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

После этого среда создается, где бы в одном месте свои собственные:

  • файлы python?
  • статические файлы (изображения/etc)?
  • «пользовательские» пакеты, например, доступные в Интернете, но не найденные в магазине сыра?

относительно каталогов virtualenv?

(Предположим, что я уже знаю where the virtualenv directories themselves should go.)

+6

@jkp: Я не согласен. Как вы планируете приложение python - это другое дело в том, как вы находите это приложение в virtualenv для целей разработки. Это связано, но не то же самое. Пожалуйста, не закрывайте дубликаты. – jcdyer

ответ

62

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

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

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

+4

Согласовано. Я использую virtualenv для всего, что я делаю, и я никогда не помещаю файлы в каталог virtualenv. Virtualenv не должен влиять на структуру вашего проекта; просто активируйте virtualenv (или используйте его bin/python) и работайте над своими файлами, где бы вы ни были. –

+0

Я также полностью согласен. Единственный раз, когда я * когда-либо касался каких-либо файлов внутри моего virtualenv (я использую 'virtualenvwrapper'), - это когда я хочу редактировать« postactivate »и« postdeactivate' hooks. –

+0

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

45

Если у вас есть только несколько проектов, каждый так часто, ничто не мешает вам создать новый 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 в одну папку, и имя каждого из них после того, как проект, который вы работаете.

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

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

Еще одно преимущество заключается в том, что некоторые из ваших проектов могут использовать один и тот же 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 

Вам больше не придется беспокоиться о том, где ваши virtualenvs находятся при работе над проектами "Foo" и "бар":

/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 
>>> 

Очень аккуратно, не так ли?

+0

Я * сильно * согласен с этим ответом об использовании 'virtualenvwrapper'. Он аккуратно абстрагирует виртуальную жизнь, сохраняя при этом все преимущества. –

+2

Но сильно * не согласен * о КОГДА-то помещаем ваш код в виртуальную среду. Если вы хотите, чтобы он «приблизился» к проекту в файловой системе, поместите каталог «venv /» на том же уровне, что и «BASE_DIR» проекта. –

2

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

ли что-то вроде этого:

$ 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, будьте осторожны, чтобы указать, что вы хотите пип установить в virtualenv с -E опцией

21

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

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

Смежные вопросы