Buildout和Virtualenv

Pat*_*ick 14 python buildout virtualenv

我正在搞乱buildout和virtualenv的组合来在python中设置一个孤立的开发环境,允许进行可重现的构建.

有一个buildout的配方,让你将virtualenv集成到buildout中:

 tl.buildout_virtual_python
Run Code Online (Sandbox Code Playgroud)

有了这个,我的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
Run Code Online (Sandbox Code Playgroud)

这将在./bin/中部署两个可执行文件:

vp
script
Run Code Online (Sandbox Code Playgroud)

当我执行vp时,我按预期得到了一个交互式,孤立的python对话框(无法从系统加载任何包).我现在所期待的是,如果我跑了

./bin/script 
Run Code Online (Sandbox Code Playgroud)

使用了孤立的python解释器.但它没有,它不是孤立的"vp"(意思是我可以从系统级别导入库).但是我可以运行:

./bin/vp ./bin/script
Run Code Online (Sandbox Code Playgroud)

哪个会在我希望的孤立环境中运行脚本.但是必须有一种方法来指定这样做而不用链接命令,否则buildout只能解决我希望的一半问题:)

谢谢你的帮助!帕特里克

Rei*_*ees 8

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

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

import sys
sys.path[0:0] = [
     '/some/thing1.egg',
     # and other things
     ]
Run Code Online (Sandbox Code Playgroud)

因此,sys.path完全取代了buildout想要在路径上拥有的内容:与virtualenv相同的隔离方法.

  • 快速更正:`sys.path [0:0] = [...]`并不完全取代sys.path,它只是在其开头插入更多项目. (7认同)

jen*_*ens 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
Run Code Online (Sandbox Code Playgroud)

前提条件:

  • bootstrap.py必须是最近匹配您正在使用的buildout版本.您可以在http://downloads.buildout.org/2/找到最新信息.

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