Buildout 和 Virtualenv

14 投票
4 回答
6741 浏览
提问于 2025-04-15 15:04

我正在尝试把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 个回答

3

在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。

6

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或更高版本不兼容的配方/扩展的版本。

8

你不需要使用virtualenv,因为buildout已经提供了一个独立的环境,和virtualenv的功能是一样的。

举个例子,看看buildout在bin目录下生成的文件。它们会包含类似下面的内容:

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

所以,sys.path会被buildout想要的路径完全替换掉,这和virtualenv的隔离方法是一样的。

撰写回答