如何在生成的生成脚本前添加路径

时间:2012-04-17 19:27:00

标签: python path buildout

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 ]

但是,还有其他方法吗?额外的一点是一个例子!

2 个答案:

答案 0 :(得分: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)包现在只需要与它构建的python包并行创建正确的.egg-info文件。我可以使用上面的配方,使用特定的软件包安装,如下所示:

[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.cfg构造。 Buildout只会找到全局安装,无需任何额外配置。卸载也可以正常工作。因此,在构建之间切换将起作用。

以下是我们在此处使用的完整工作的buildout .cfg文件:https://github.com/idiap/bob.project.example/blob/master/localbob.cfg

问题是:是否有更简单的方法来实现相同的外部食谱?

答案 1 :(得分:0)

嗯,你错过的可能是最有用的扩建扩展,mr.developer。 通常情况下,包裹,假设foo.bar将在某些回购中,让我们说git。

您的扩建程序看起来像

[buildout]
extensions = mr.developer

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

如果您的包中没有包,则可以使用fs代替git,请查看文档以获取详细信息。

激活“本地”版本由

完成
./bin/develop a foo.bar

停用

./bin/develop d foo.bar

您可以使用mr.developer执行其他一些操作,请查看它!