无法对未注册的加载器类型

时间:2017-12-14 10:51:52

标签: python-3.x bokeh pyinstaller

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

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

PS。 Win10,Python 3.6.3,pyinstaller 3.4,散景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

请事先提供帮助

2 个答案:

答案 0 :(得分:2)

使用pyinstaller进入相同的错误。

这应该可以解决您的问题以及未找到jinja2的问题:

编辑文件:your-python-env \ Lib \ site-packages \ bokeh \ core \ templates.py

(nb:将你的python-env更改为你已安装python的地方)

并从以下位置更改import语句:

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。

答案 1 :(得分:0)

Bokeh在很大程度上依赖于Jinja2的运作。 Jinja和Pyinstaller之间似乎存在问题:

https://github.com/pyinstaller/pyinstaller/issues/1898

除非这些下游问题得到解决,否则这可能根本无法实现。