Buildout和Virtualenv

时间:2009-10-14 16:35:43

标签: python virtualenv buildout

我正在使用buildout和virtualenv的组合来在python中设置隔离的开发环境,以便进行可重现的构建。

有一个buildout的配方,让你将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

将在我希望的隔离环境中运行脚本。但是必须有一种方法来指定这样做而不用链接命令,否则buildout只解决了我希望的一半问题:)

感谢您的帮助! 帕特里克

4 个答案:

答案 0 :(得分:8)

你不需要virtualenv:buildout已经提供了一个孤立的环境,就像virtualenv一样。

例如,查看bin目录中生成的文件buildout。他们会有类似的东西:

import sys
sys.path[0:0] = [
     '/some/thing1.egg',
     # and other things
     ]

所以sys.path完全被buildout想要在路径上取代:与virtualenv相同的隔离方法。

答案 1 :(得分:6)

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必须是最近匹配您正在使用的buildout版本的版本。您可以在http://downloads.buildout.org/2/

  • 找到最新信息
  • 如果您的buildout中有任何版本引脚,请确保它们不会自行构建或将配方/扩展插入与zc.buildout 2或更高版本不兼容的版本。

答案 2 :(得分:3)

如果在ubuntu服务器上使用bootstrap运行buildout问题,那么我将使用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。

答案 3 :(得分:0)

我之前从未使用过这个食谱,但我要尝试的第一件事是:

[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和脚本),并查看他们正在使用的Python路径。如果您在Windows上,通常会有一个名为<script_name>-script.py的文件。在这种情况下,那将是vp-script.py和script-script.py。