【问题标题】:Unable to use jinja2 template in pip package created from python module无法在从 python 模块创建的 pip 包中使用 jinja2 模板
【发布时间】:2017-02-14 16:50:30
【问题描述】:

我有一个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

我花了几个小时在谷歌上搜索,阅读类似的 stackoverflow 线程,阅读 jinja 和 setuptools 文档,以及阅读类似的代码。我测试过的所有东西都会产生同样的错误信息,我有点不知所措。非常感谢任何帮助。

【问题讨论】:

    标签: python python-2.7 pip jinja2 setuptools


    【解决方案1】:

    MANIFEST.in 告诉源分发中要包含哪些文件,即python setup.py sdist,但它不会直接影响安装哪些文件,因为pip install . 只是调用 setuptools 并且对 package_data 没有做任何特别的事情。

    您需要将文件包含在 setup.py 文件中,作为包数据或附加文件。

    详情见https://docs.python.org/2/distutils/setupscript.html,关注页面data_filespackage_data

    【讨论】:

    猜你喜欢
    • 2020-01-26
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多