如何从Python代码访问$ {buildout:directory}?

时间:2013-01-04 23:09:23

标签: python pyramid buildout paster

我有一个使用zc.buildout管理的Pyramid Web应用程序。在其中,我需要读取磁盘上的文件,该文件位于buildout目录的子目录中。

问题在于确定文件的路径 - 我不想对绝对路径进行硬编码,只是在生产中提供应用程序时提供相对路径不起作用(假设工作目录不同)。

所以我正在考虑的有希望的“钩子”是:

  • “root”buildout目录,我可以在buildout.cfg中将其作为${buildout:directory}进行处理 - 但是,我无法弄清楚如何“导出”它以便可以通过Python代码

  • Paster启动应用程序的.ini文件的位置

2 个答案:

答案 0 :(得分:2)

如果相对于pouts.ini的buildout根目录或位置的文件路径总是相同的,这似乎是你的问题,你可以在paster.ini中设置它:

[app:main]
...
config_file = %(here)s/path/to/file.txt

然后在Reinout的回答中从注册表中访问它:

def your_view(request):
    config_file = request.registry.settings['config_file']

答案 1 :(得分:0)

这是我设计的一个相当笨拙的解决方案:

buildout.cfg我使用extra-paths的{​​{1}}选项将buildout目录添加到zc.recipe.egg

sys.path

然后我将一个名为.... [webserver] recipe = zc.recipe.egg:scripts eggs = ${buildout:eggs} extra-paths = ${buildout:directory} 的文件放入buildout目录:

app_config.py

现在我们可以在Python代码中导入它:

# This remembers the root of the installation (similar to {buildout:directory}
# so we can import it and use where we need access to the filesystem.
# Note: we could use os.getcwd() for that but it feels kinda wonky
# This is not directly related to Celery, we may want to move it somewhere
import os.path
INSTALLATION_ROOT = os.path.dirname(__file__)

如果有人知道更好的解决方案,欢迎您:)