Подтвердить что ты не робот

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 в изолированной среде по своему усмотрению. Но должен быть способ указать это, чтобы сделать это без цепочки команд, иначе построение решает только половину проблем, которые я надеялся:)

Спасибо за вашу помощь! Патрик

4b9b3361

Ответ 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.