Buildout и Virtualenv
Я взаимодействую с комбинацией buildout и virtualenv для настройки изолированной среды разработки на python, что позволяет делать воспроизводимые сборки.
Существует рецепт построения, который позволяет интегрировать virtualenv в buildout:
tl.buildout_virtual_python
С этим мой buildout.cfg выглядит так:
[buildout]
develop = .
parts = script
virtualpython
[virtualpython]
recipe = tl.buildout_virtual_python
headers = true
executable-name = vp
site-packages = false
[script]
recipe = zc.recipe.egg:scripts
eggs = foo
python = virtualpython
Это приведет к развертыванию двух исполняемых файлов в. /bin/:
vp
script
Когда я выполняю vp, я получаю интерактивное изолированное диалоговое окно python, как и ожидалось (не может загружать какие-либо пакеты из системы).
Теперь я ожидаю, что если я запустил
./bin/script
используется изолированный интерпретатор python. Но это не так, оно не изолировано как "vp" (это означает, что я могу импортировать библиотеки с системного уровня). Однако я могу запустить:
./bin/vp ./bin/script
Что будет запускать script в изолированной среде по своему усмотрению. Но должен быть способ указать это, чтобы сделать это без цепочки команд, иначе построение решает только половину проблем, которые я надеялся:)
Спасибо за вашу помощь!
Патрик
Ответы
Ответ 1
Вам не нужен virtualenv: buildout уже предоставляет изолированную среду, так же как virtualenv.
В качестве примера рассмотрим создание файлов в каталоге bin. У них будет что-то вроде:
import sys
sys.path[0:0] = [
'/some/thing1.egg',
# and other things
]
Итак, sys.path
полностью заменяется тем, что хочет построить на пути: тот же метод изоляции, что и virtualenv.
Ответ 2
zc.buildout 2.0, а позже больше не предоставляет изолированную среду.
Но virtualenv 1.9, а затем обеспечивает полную изоляцию (в том числе не устанавливать setuptools).
Таким образом, самый простой способ получить сборку в полностью контролируемой среде - выполнить следующие шаги (здесь для широко используемого Python 2.7):
cd /path/to/buildout
rm ./bin/python
/path/to/virtualenv-2.7 --no-setuptools --no-site-packages --clear .
./bin/python2.7 bootstrap.py
./bin/buildout
Предпосылки:
-
bootstrap.py
должен быть последним, совпадающим с используемой версией сборки. Вы найдете последнее в http://downloads.buildout.org/2/
-
если в вашей компоновке есть какие-либо штырьки версии, убедитесь, что они не выписывают сами сборки или рецепты/расширения в версии, не совместимые с zc.buildout 2 или новее.
Ответ 3
Если вы запускаете buildout с помощью bootstrap на сервере ubuntu, я буду использовать virtualenv и buildout вместе. Просто создайте virualenv и установите в него buildout. Таким образом, в систему должен быть установлен только virtualenv (теоретически 1).
$ virtualenv [options_you_might_need] virtual
$ source virtual/bin/activate
$ pip install zc.buildout
$ buildout -c <buildout.cfg>
Также скажите buildout, чтобы поместить свои скрипты в каталог virtual/bin/, таким образом, скрипты появляются на $PATH
.
[buildout]
bin-directory = ${buildout:directory}/virtual/bin
...
1: На практике вам, вероятно, понадобятся яйца, которые требуют компиляции на системный уровень, требующий компиляции. Яйца, такие как mysql или memcache.
Ответ 4
Я никогда раньше не использовал этот рецепт, но первое, что я попробую, это следующее:
[buildout]
develop = .
parts = script
virtualpython
[virtualpython]
recipe = tl.buildout_virtual_python
headers = true
executable-name = vp
site-packages = false
[script]
recipe = zc.recipe.egg:scripts
eggs = foo
python = virtualpython
interpreter = vp
Если это не сработает, вы обычно можете открыть сценарии (в данном случае vp и script) в текстовом редакторе и увидеть пути Python, которые они используют. Если вы находитесь в Windows, обычно будет файл с именем <script_name>-script.py
. В этом случае это будет vp- script.py и script - script.py.