在诗歌项目中包含模板文件

Include template files in poetry project

我有一个使用诗歌的命令行 python 应用程序,我想附带几个 jinja2 模板文件。据我所知,我将它们放在 template 目录中。我将如何使用应用程序发送这些模板,以及如何确保应用程序知道模板所在的位置?

这是我(天真的)尝试使用 pkgutil 来完成此任务:

目录结构:

.
├── app.py
├── LICENSE
├── poetry.lock
├── pyproject.toml
└── templates
    └── message.en_US.jinja2

app.py:

import pkgutil
from jinja2 import Environment, FileSystemLoader

data = pkgutil.get_data(__name__, "templates")

env = Environment(loader=FileSystemLoader(data))
template = env.get_template("message.en_US.jinja2")
print(template.render({"foo": 1, "bar": 2}))

pyproject.toml:

[tool.poetry]
name = "app"
version = "0.1.0"
description = "Does stuff"
authors = ["Foo Bar <foo@bar.com>"]
license = "AGPL-3.0-or-later"

[tool.poetry.dependencies]
python = "^3.8"
jinja2 = "^2.11.3"

[tool.poetry.scripts]
app = "app:main"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

此操作失败,因为未打包模板文件夹。我也不知道我是否可以像这样将文件夹传递给 Environment 构造函数。

Jinja 的上下文中,这可以使用 PackageLoader 轻松完成,它能够直接从 Python 导入包加载资源。

当然还要确保资源文件(模板文件)正确“打包”:这些文件应该是导入包的一部分。对于 poetry,请确保 pyproject.toml 中的 include and packages 字段具有正确的值。