我有一个使用zc.buildout管理的Pyramid Web应用程序。在其中,我需要读取磁盘上的文件,该文件位于buildout目录的子目录中。
问题在于确定文件的路径 - 我不想对绝对路径进行硬编码,只是在生产中提供应用程序时提供相对路径不起作用(假设工作目录不同)。
所以我正在考虑的有希望的“钩子”是:
“root”buildout目录,我可以在buildout.cfg中将其作为${buildout:directory}
进行处理 - 但是,我无法弄清楚如何“导出”它以便可以通过Python代码
Paster启动应用程序的.ini文件的位置
答案 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__)
如果有人知道更好的解决方案,欢迎您:)