Buildout 和 Virtualenv
我正在尝试把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只解决了我希望解决的一半问题 :)
谢谢你的帮助!
Patrick
4 个回答
在Ubuntu服务器上使用bootstrap运行buildout时遇到了一些问题,所以我现在是把virtualenv和buildout一起用。简单来说,就是先创建一个virtualenv,然后在里面安装buildout。这样的话,理论上只需要把virtualenv安装到系统里就可以了。
$ 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: 实际上,你可能还需要一些需要编译的库(也叫“egg”),这些库需要在系统级别进行编译,比如mysql或memcache。
zc.buildout 2.0 及以后的版本不再提供隔离环境。
但是virtualenv 1.9 及以后的版本提供了完全的隔离(包括不安装setuptools)。
所以,要在一个完全受控的环境中使用buildout,最简单的方法是按照以下步骤操作(这里以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中有任何版本限制,请确保它们不会限制buildout本身或与zc.buildout 2或更高版本不兼容的配方/扩展的版本。
你不需要使用virtualenv,因为buildout已经提供了一个独立的环境,和virtualenv的功能是一样的。
举个例子,看看buildout在bin目录下生成的文件。它们会包含类似下面的内容:
import sys
sys.path[0:0] = [
'/some/thing1.egg',
# and other things
]
所以,sys.path
会被buildout想要的路径完全替换掉,这和virtualenv的隔离方法是一样的。