无法在从 python 模块创建的 pip 包中使用 jinja2 模板
Unable to use jinja2 template in pip package created from python module
我有一个 python 项目,其目录结构如下
foo
|--MANIFEST.in
|--requirements.txt
|--setup.py
|--foo.py
|--templates/
|--bar.tmpl
其中 setup.py
是一个 python 脚本。以前,我使用安装脚本将脚本符号链接到我用户的私有 bin
(并成功使用它),但决定将其打包(第一次这样做)。我能够使用项目根目录中的 $ pip install .
在 virutalenv 中成功安装包,并且我能够执行大部分脚本,直到我使用 jinja2
生成模板。似乎 templates
目录没有与软件包的其余部分一起安装,或者我的脚本没有正确找到 templates
目录的路径。
摘自foo.py
:
from jinja2 import Environment, ModuleLoader
def generate_readme(template_file):
template_env = Environment(loader=PackageLoader('foo','templates'))
template = template_env.get_template(template_file)
template_vars = {"title": get_title()}
output = template.render(template_vars)
return output
注意:'bar.tmpl'
作为template_file
传递给这个函数
摘自setup.py
:
from setuptools import setup
setup(name='foo',
py_modules=['foo'],
entry_points={'console_scripts': ['foo = foo:foo']}
include_package_data=True,
zip_safe=False)
MANIFEST.in
的内容:
include templates/*
相关追溯:
File "/home/username/.virtualenvs/foo/local/lib/python2.7/site-packages/foo.py", line 30, in generate_readme
template = template_env.get_template(template_file)
File "/home/username/.virtualenvs/foo/local/lib/python2.7/site-packages/jinja2/environment.py", line 812, in get_template
return self._load_template(name, self.make_globals(globals))
File "/home/username/.virtualenvs/foo/local/lib/python2.7/site-packages/jinja2/environment.py", line 774, in _load_template
cache_key = self.loader.get_source(self, name)[1]
File "/home/username/.virtualenvs/foo/local/lib/python2.7/site-packages/jinja2/loaders.py", line 235, in get_source
raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound: bar.tmpl
我花了几个小时谷歌搜索、阅读类似的 Whosebug 线程、阅读 jinja 和 setuptools 文档以及阅读类似的代码。我测试过的所有内容都导致相同的错误消息,我有点不知所措。非常感谢任何帮助。
MANIFEST.in
告诉源代码分发中要包含哪些文件,即 python setup.py sdist
,但它不会直接影响安装的文件,因为 pip install .
只是调用 setuptools 而不会' package_data.
没有做任何特别的事情
您需要将文件包含在 setup.py 文件中,作为包数据或附加文件。
详见https://docs.python.org/2/distutils/setupscript.html,关注页面data_files
和package_data
我有一个 python 项目,其目录结构如下
foo
|--MANIFEST.in
|--requirements.txt
|--setup.py
|--foo.py
|--templates/
|--bar.tmpl
其中 setup.py
是一个 python 脚本。以前,我使用安装脚本将脚本符号链接到我用户的私有 bin
(并成功使用它),但决定将其打包(第一次这样做)。我能够使用项目根目录中的 $ pip install .
在 virutalenv 中成功安装包,并且我能够执行大部分脚本,直到我使用 jinja2
生成模板。似乎 templates
目录没有与软件包的其余部分一起安装,或者我的脚本没有正确找到 templates
目录的路径。
摘自foo.py
:
from jinja2 import Environment, ModuleLoader
def generate_readme(template_file):
template_env = Environment(loader=PackageLoader('foo','templates'))
template = template_env.get_template(template_file)
template_vars = {"title": get_title()}
output = template.render(template_vars)
return output
注意:'bar.tmpl'
作为template_file
摘自setup.py
:
from setuptools import setup
setup(name='foo',
py_modules=['foo'],
entry_points={'console_scripts': ['foo = foo:foo']}
include_package_data=True,
zip_safe=False)
MANIFEST.in
的内容:
include templates/*
相关追溯:
File "/home/username/.virtualenvs/foo/local/lib/python2.7/site-packages/foo.py", line 30, in generate_readme
template = template_env.get_template(template_file)
File "/home/username/.virtualenvs/foo/local/lib/python2.7/site-packages/jinja2/environment.py", line 812, in get_template
return self._load_template(name, self.make_globals(globals))
File "/home/username/.virtualenvs/foo/local/lib/python2.7/site-packages/jinja2/environment.py", line 774, in _load_template
cache_key = self.loader.get_source(self, name)[1]
File "/home/username/.virtualenvs/foo/local/lib/python2.7/site-packages/jinja2/loaders.py", line 235, in get_source
raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound: bar.tmpl
我花了几个小时谷歌搜索、阅读类似的 Whosebug 线程、阅读 jinja 和 setuptools 文档以及阅读类似的代码。我测试过的所有内容都导致相同的错误消息,我有点不知所措。非常感谢任何帮助。
MANIFEST.in
告诉源代码分发中要包含哪些文件,即 python setup.py sdist
,但它不会直接影响安装的文件,因为 pip install .
只是调用 setuptools 而不会' package_data.
您需要将文件包含在 setup.py 文件中,作为包数据或附加文件。
详见https://docs.python.org/2/distutils/setupscript.html,关注页面data_files
和package_data