使用 pyinstaller 遇到同样的错误。
这应该可以解决您的问题以及随后找不到 jinja2 的问题:
编辑文件:your-python-env\Lib\site-packages\bokeh\core\templates.py
(注意:将 your-python-env 更改为安装 python 的位置)
并将导入语句更改为:
import json
from jinja2 import Environment, PackageLoader, Markup
至以下内容:
import json
import sys, os
import bokeh.core
from jinja2 import Environment, FileSystemLoader, Markup
接下来,找到显示以下内容的行:
_env = Environment(loader=PackageLoader('bokeh.core', '_templates'))
注释掉它并用以下代码替换它:
# _env = Environment(loader=PackageLoader('bokeh.core', '_templates'))
if getattr(sys, 'frozen', False):
# we are running in a bundle
templatedir = sys._MEIPASS
else:
# we are running in a normal Python environment
templatedir = os.path.dirname(bokeh.core.__file__)
_env = Environment(loader=FileSystemLoader(templatedir + '\\_templates'))
(改编自:https://pythonhosted.org/PyInstaller/runtime-information.html https://pythonhosted.org/PyInstaller/runtime-information.html)
这样做的作用是,当代码被冻结时,它将 jinja2 重定向到 sys._MEIPASS (这是您的发行版所在的文件夹)。具体来说,它在 sys._MEIPASS_templates 中查找 jinja2 模板。当冷冻时,file指向错误的位置,因此出现了最初的问题。
所以现在,我们必须确保 jinja2 文件最终位于 _templates 文件夹中。为此,我们编辑 pyinstaller .spec。这适用于编译到一个目录或一个文件。将 .spec 文件中的数据编辑为:
a = Analysis(['graphms-gui.py'],
pathex=['C:\\Users\\choom.000\\Documents\\forcompile270218'],
binaries=[],
datas=[(r'your-python-env\Lib\site-packages\bokeh\core\_templates','_templates'),
],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
它的作用是获取 core_template 文件夹的内容并将其复制到 dist_templates。这正是我们在 templates.py 中查找 jinja2 文件的位置。
这为我解决了 pyinstaller==3.3.1、bokeh==0.12.9 和 jinja2==2.10 的问题。