Skip to main content
 首页 » 编程设计

python之如何访问 ${buildout :directory} from Python code

2025年05月04日29emanlee

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

问题在于确定文件的路径——我不想对绝对路径进行硬编码,并且在生产环境中提供应用程序时仅提供相对路径是行不通的(据说是因为工作目录不同)。

所以我正在考虑的有前途的“钩子(Hook)”是:

  • “根”buildout 目录,我可以在 buildout.cfg 中将其作为 ${buildout:directory} - 但是,我不知道如何“导出”这样它就可以被 Python 代码访问

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

请您参考如下方法:

就像@MartijnPieters 在对您自己的回答的评论中建议的那样,我会使用 collective.recipe.template在 .ini 中生成一个条目。我想知道我如何才能在我的项目中访问这些数据,所以我解决了 :-)

让我们回过头来找到您需要的东西。首先在您想要构建目录的 View 代码中:

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

request.registry.settings ( see documentation ) 是一个“类似字典的部署设置对象”。参见 deployment settings ,这是传递给您的主要方法的 **settings,例如 def main(global_config, **settings)

这些设置位于 deployment.ini 或 production.ini 文件的 [app:main] 部分。所以在那里添加构建目录:

[app:main] 
use = egg:your_app 
 
buildout_dir = /home/you/wherever/it/is 
 
pyramid.reload_templates = true 
pyramid.debug_authorization = false 
... 

但是,这是最后一步,您不希望在其中包含该硬编码路径。因此,使用模板生成 .ini。模板 development.ini.in 使用 ${partname:variable} 扩展语言。在你的情况下你需要${buildout:directory}:

[app:main] 
use = egg:your_app 
 
buildout_dir = ${buildout:dir} 
#              ^^^^^^^^^^^^^^^ 
 
pyramid.reload_templates = true 
pyramid.debug_authorization = false 
... 

在buildout.cfg中添加buildout部分,从development.ini.in生成development.ini:

[buildout] 
... 
parts = 
    ... 
    inifile 
    ... 
 
[inifile] 
recipe = collective.recipe.template 
input = ${buildout:directory}/development.ini.in 
output = ${buildout:directory}/development.ini 

请注意,您可以使用 collective.recipe.template 做各种很酷的事情。例如,${serverconfig:portnumber} 在您的 production.ini 和 your_site_name.nginx.conf 中生成匹配的端口号。玩得开心!