python-3.x - 无法对未注册的加载程序类型执行此操作

标签 python-3.x bokeh pyinstaller

我正在使用 Bokeh 进行数据可视化,并尝试制作可执行文件,但它显示错误消息“无法为未注册的加载程序类型执行此操作”

我已尝试作为 的解决方案初始化 .py 到我的 script.py 的目录(+subdir),但它不起作用。

PS。 Win10,Python 3.6.3,pyinstaller 3.4, Bokeh 0.12.13

代码:

from bokeh.plotting import figure, show

p = figure(width=800, height=400, title="Money")
p.title.text_color = "green"
p.title.text_font_size = "18pt"
p.xaxis.axis_label = "Time"
p.xaxis.axis_label_text_color = "violet"
p.yaxis.axis_label = "Money"
p.yaxis.axis_label_text_color = "violet"
dashs = [12, 4]
listx1 = [1,5,7,9,13,16]
listy1 = [15,50,80,40,70,50]
p.line(listx1, listy1, line_width=4, line_color="red", line_alpha=0.3, line_dash=dashs, legend="Idle")

show(p)

错误信息:
enter image description here

提前谢谢您的帮助

最佳答案

使用 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)

它的作用是当代码被卡住时,它会将 jinja2 重定向到 sys._MEIPASS(这是您的发行版所在的文件夹)。具体来说,它在 sys._MEIPASS_templates 中查找 jinja2 模板。冷冻时,文件 指向错误的位置,因此是原始问题。

所以现在,我们必须确保 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 的问题。

关于python-3.x - 无法对未注册的加载程序类型执行此操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47811533/

相关文章:

python - 将新数据附加到python中的json文件中

python - TypeError:实例 Python 之间不支持 '<'

python - 如何从 pyinstaller 的输出文件创建 .app?

Python 如何将脚本从 Windows 移动到 Linux?

python - python中是否可以同时运行多个asyncio?

python - matplotlib:将颜色分配给半径

python - 如何让 Bokeh HTML 可视化显示在 WordPress 上?

python - Bokeh 中的等高线图

python - 有没有一种方法可以将带有条形图的 3 条线图绘制为具有不同 y 轴的一个图形?

python - pyinstaller排除模块原因 "failed to execute script"