Куда в virtualenv идет пользовательский код?
какую структуру каталогов следует использовать при использовании virtualenv
? Например, если бы я создавал приложение WSGI и создал virtualenv под названием foobar
Я бы начал со структуры каталогов, как:
/foobar
/bin
{activate, activate.py, easy_install, python}
/include
{python2.6/...}
/lib
{python2.6/...}
как только эта среда будет создана, где бы одно место их собственное:
- файлы python?
- статические файлы (изображения/etc)?
- "пользовательский" пакеты, такие как те, которые доступны в интернете, но не нашли в Сырная лавка?
в отношении virtualenv
каталоги?
(предположим, я уже знаю, куда должны идти сами каталоги virtualenv.)
4 ответа:
virtualenv
предоставляет экземпляр интерпретатора python, а не экземпляр приложения. Обычно вы не создаете свои файлы приложений в каталогах, содержащих системный Python по умолчанию, также нет необходимости находить ваше приложение в каталоге virtualenv.например, у вас может быть проект, в котором у вас есть несколько приложений, использующих один и тот же virtualenv. Или вы можете тестировать приложение с помощью virtualenv, который будет позже развернут с системой Python. Или вы можете упаковывать отдельное приложение, где может иметь смысл иметь каталог virtualenv, расположенный где-то в самом каталоге приложений.
Так, в общем, я не думаю, что есть один правильный ответ на вопрос. И хорошая вещь о
virtualenv
Это то, что он поддерживает много различных вариантов использования: там не должно быть один правильный путь.
если у вас есть только несколько проектов каждый так часто, ничто не мешает вам создать новый 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 " и "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 >>>
довольно аккуратно, не так ли?
поскольку virtualenvs не могут быть перемещены, на мой взгляд, это плохая практика, чтобы разместить файлы проекта в каталоге virtualenv. Сам virtualenv является сгенерированным артефактом разработки / развертывания (вроде как a .pyc file), а не часть проекта; его должно быть легко сдуть и воссоздать в любое время или создать новый на новом хосте развертывания и т. д.
многие люди на самом деле использовать virtualenvwrapper, который удаляет фактические virtualenvs из вашего осознание почти полностью, помещая их все бок о бок в $HOME/.virtualenvs по умолчанию.
если вы дадите свой проект
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
The
-e
поставит проект вmyproject/src
, но связать его сmyproject/lib/pythonX.X/site-packages/
, поэтому любые изменения, которые вы сделаете, будут немедленно подобраны в модулях, которые импортируют его из вашего локальногоsite-packages
. Элемент#egg
бит говорит Пипу, какое имя вы хотите дать пакету яиц, который он создает для вас.если вы не используете
--no-site-packages
, будь осторожен чтобы указать, что вы хотите установить pip в virtualenv с помощью-E
опции