【发布时间】:2015-07-07 04:18:10
【问题描述】:
我有一个使用 Jinja2 模板的 python 脚本,我正在尝试使用 Pyinstaller 创建一个单文件夹分发。
在 Jinja 中,我通过使用 PackageLoader 类让程序了解模板的位置。下面的代码显示它指向我在pycorr Python 包下的templates 文件夹。
env = Environment(loader=PackageLoader('pycorr', 'templates'))
template = env.get_template('child_template.html')
这是我的文件夹结构:
pycorr
| |
| + templates
| |
| + base.html
| + child.html
当我使用 Pyinstaller 将包编译到单个文件夹中时,我没有看到任何与 Jinja2 相关的警告/错误,并且我能够启动 .exe 文件。但是,当程序开始寻找 Jinja2 模板时,它会失败并在控制台窗口上显示以下错误消息:
Traceback (most recent call last):
...
File "C:\Users\ ... \out00-PYZ.pyz\pycorr.WriterToHTML", line 96, in htmlout_table
File "C:\Users\ ... \out00-PYZ.pyz\pycorr.WriterToHTML", line 13, in __init__
File "C:\Users\ ... \out00-PYZ.pyz\pycorr.WriterToHTML", line 48, in __set_template
File "C:\Users\ ... \out00-PYZ.pyz\jinja2.environment", line 791, in get_template
File "C:\Users\ ... \out00-PYZ.pyz\jinja2.environment", line 765, in _load_template
File "C:\Users\ ... \out00-PYZ.pyz\jinja2.loaders", line 113, in load
File "C:\Users\ ... \out00-PYZ.pyz\jinja2.loaders", line 224, in get_source
File "C:\Users\ ... \dist\OCA_CO~1\eggs\setuptools-14.3-py2.7.egg\pkg_resources\__init__.py", line 1572, in has_resource
return self._has(self._fn(self.module_path, resource_name))
File "C:\Users\ ... \dist\OCA_CO~1\eggs\setuptools-14.3-py2.7.egg\pkg_resources\__init__.py", line 1627, in _has
"Can't perform this operation for unregistered loader type"
NotImplementedError: Can't perform this operation for unregistered loader type
我不太明白错误信息,但我猜 Pyinstaller 需要找到 templates 文件夹。所以我在 Pyinstaller .spec 文件中添加了这些行:
a.datas += [('BASE', './pycorr/templates/base.html', 'DATA')]
a.datas += [('TABLE', './pycorr/templates/table_child.html', 'DATA')]
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=None,
upx=False,
name='OCA_correlation')
但这似乎并没有解决问题。
有人可以帮忙吗?我多次阅读 Pyinstaller 手册,但我就是想不通。
【问题讨论】:
-
尽管这个问题已经很老了,作者可能自己想通了,
pkg_resources不受 pyinstaller 支持,如here 所述。因此无法使用 Jinja2 Package Loader。
标签: python templates jinja2 pyinstaller