14

我正在使用 buildout 和 virtualenv 的组合来在 python 中设置一个隔离的开发环境,允许进行可重复的构建。

有一个构建方法可以让您将 virtualenv 集成到构建中:

 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

4 回答 4

8

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

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

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

因此,它sys.path完全被构建想要在路径上拥有的东西所取代:与 virtualenv 相同的隔离方法。

于 2009-12-03T20:28:31.910 回答
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必须是与您正在使用的构建版本匹配的最新版本。您可以在http://downloads.buildout.org/2/找到最新的

  • 如果您的 buildout 中有任何版本引脚,请确保它们不会将 buildout 本身或配方/扩展固定到与 zc.buildout 2 或更高版本不兼容的版本。

于 2013-10-24T09:30:35.943 回答
3

在 ubuntu 服务器上使用引导程序运行 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 这样的鸡蛋。

于 2012-07-17T20:26:01.910 回答
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。

于 2009-10-14T16:56:28.890 回答