4

在我们的目录中zc.buildout使用,生成的脚本如下所示:zc.recipe.egg<package>/bin/

#! <python shebang> -S

import sys
sys.path[0:0] = [
    ... # some paths derived from the eggs
    ... # some other paths included with zc.recipe.egg `extra-path`
]

# some user initialization code from zc.recipe.egg `initialization`

# import function, call function

我无法找到一种方法,以编程 方式在每个脚本中引入的构造中添加路径。sys.path这可能吗?

原因:我有一个全局安装的 python 项目版本和本地安装的另一个版本(off-buildout 树)。我希望能够在这两个版本之间切换。

注意:显然,可以使用zc.recipe.egg/initialization属性添加如下内容:

initialization = sys.path[0:0] = [ /add/path/to/my/eggs ]

但是,还有其他方法吗?举例加分!

4

2 回答 2

1

最后,我通过创建自己的构建配方获得了一个工作环境,您可以在此处找到该配方:https ://github.com/idiap/local.bob.recipe 。包含配方的文件是这个:https ://github.com/idiap/local.bob.recipe/blob/master/config.py 。在类构造函数中有很多特定于我们软件的检查以及一些额外的改进,但不要为此烦恼。“真肉(TM)”就是上install()那个类的方法。它或多或少是这样的:

egg_link = os.path.join(self.buildout['buildout']['eggs-directory'], 'external-package.egg-link')
f = open(egg_link, 'wt')
f.write(self.options['install-directory'] + '\n')
f.close()
self.options.created(egg_link)
return self.options.created()

这会成功的。我的外部(基于 CMake)包现在只需创建正确的.egg-info文件与它构建的 python 包并行。比,我可以使用上面的配方,像这样使用特定的包安装:

[buildout]
parts = external_package python
develop = .
eggs = my_project
       external_package
       recipe.as.above

[external_package]
recipe = recipe.as.above:config
install-directory = ../path/to/my/local/package/build

[python]
recipe = zc.recipe.egg
interpreter = python
eggs = ${buildout:eggs}

如果您想切换安装,只需更改install-directory上面的属性。如果您希望使用系统范围内可用的默认安装,只需从文件中完全删除recipe.as.above结构即可。buildout.cfgBuildout 只会找到不需要任何额外配置的全局安装。卸载也将正常工作。因此,在构建之间切换就可以了。

这是我们在这里使用的完整工作的构建.cfg文件:https ://github.com/idiap/bob.project.example/blob/master/localbob.cfg

问题是:有没有一种更简单的方法可以在没有这个外部配方的情况下实现同样的效果?

于 2012-04-18T08:51:33.700 回答
0

好吧,您错过的可能是最有用的构建扩展mr.developer。通常,这个包,比如说foo.bar将在某个 repo 中,比如说 git。

你的扩建看起来像

[buildout]
extensions = mr.developer

[sources]
foo.bar = git git@github.com:foo/foo.bar.git

如果您没有在 repo 中包含您的包,您可以使用fs而不是git,请查看文档以获取详细信息。

激活“本地”版本由

./bin/develop a foo.bar

停用方式

./bin/develop d foo.bar

您还可以做很多其他事情mr.developer,请检查一下!

于 2012-04-17T21:12:44.783 回答