gpt4 book ai didi

python - 将 PyInstaller 与 Bokeh 和 CustomJS 结合使用

转载 作者:行者123 更新时间:2023-12-01 02:01:02 29 4
gpt4 key购买 nike

我正在开发一个使用 Bokeh 和 PubSub 以及其他 python 模块的 python 应用程序。我快完成了,而且运行得很好。但是当我尝试使用 PyInstaller 将其制作为可执行文件时,我遇到了很多问题。我通过使用 @dzman 的帖子 this 解决了 Jinja2 TemplateNotFound 和未注册的加载器类型问题。线。我通过使用 @Stefano 的帖子 this 解决了 PubSub 导入问题线。现在的问题是,当我尝试运行 .exe 文件时,它会抛出错误,如下所示

Traceback (most recent call last):
File "module1.py", line 191, in <lambda>
File "module1.py", line 274, in getQueryItems
File "module1.py", line 353, in queryTheDatabaseToGetResult
File "module1.py", line 399, in createDataframeFromTheResult
File "module2.py", line 17, in __init__
File "module2.py", line 75, in plotFunction
File "site-packages\bokeh\models\callbacks.py", line 68, in
from_coffeescript
File "site-packages\bokeh\util\compiler.py", line 190, in nodejs_compile
File "site-packages\bokeh\util\compiler.py", line 169, in _run_nodejs
File "site-packages\bokeh\util\compiler.py", line 164, in _run
RuntimeError: module.js:538
throw err;
^

Error: Cannot find module 'C:\Users\user_name\Desktop\PYTHON~1\dist\PATHWA~1\bokeh\server\static\js\compiler.js'
at Function.Module._resolveFilename (module.js:536:15)
at Function.Module._load (module.js:466:25)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3

在代码中,错误发生在以下代码片段的最后一行,

    checkbox.callback = CustomJS.from_coffeescript(args = dict(plot = fig, checkbox = checkbox), code=""" 

rends = plot.select("hideable");
rends[i].visible = i in checkbox.active for i in [0...rends.length];

""") #This is line 68 as shown in the error message

所以,这是 CustomJS 代码失败的地方。我找不到一篇描述如何在 Bokeh 中将 PyInstaller 与 Custom JS 结合使用的帖子。但我确实需要这样做,因为我必须分发可执行文件。非常感谢任何帮助,并提前致谢!

我正在使用 Pyinstaller 3.3.1、Python 2.7 和 Bokeh 0.12.11

最佳答案

所以,问题是程序找不到compiler.js 文件。我必须做一些更改才能将此文件合并到 PyInstaller 可执行文件中。 ..\bokeh\util 下存在 compiler.py 文件。在此文件中的 nodejs_compile 函数下,

def nodejs_compile(code, lang="javascript", file=None):
compilejs_script = join(bokehjs_dir, "js", "compiler.js")
...
...

它正在使用bokehjs_dir,它已在文件中定义为

bokehjs_dir = settings.bokehjsdir()

bokehjs_dir 是一个变量,最终会被其他变量附加,并为程序提供到达 compiler.js 文件的路径)

因此,bokehjs_dir 的值被设置为 bokeh 目录的绝对路径,这导致了问题,因为生成的可执行文件无法访问该目录。

所以只需注释掉该行并添加代码片段,如下所示,

import bokeh

#bokehjs_dir = settings.bokehjsdir()

if getattr(sys, 'frozen', False):
# we are running in a bundle
temp_dir = sys._MEIPASS
else:
# we are running in a normal Python environment
temp_dir = os.path.dirname(bokeh.__file__)

bokehjs_dir = temp_dir + '\\server\\static'

正如已经引用的帖子中提到的,它的作用是当代码被卡住时,它将程序重定向到 sys._MEIPASS (PyInstaller 创建的用于解压 bundle 的临时文件夹)。

现在需要做的就是在 bundle 中包含 ..\bokeh\server\static\文件夹,其名称与 static 相同。这可以通过编辑 pyinstaller .spec 文件来完成。编辑后的 ​​.spec 文件如下所示,

a = Analysis(['module1.py'],
pathex=['C:\\Users\\user_name\\Desktop\\PythonFiles'],
binaries=[],
datas=[(r'C:\Python27\Lib\site-packages\bokeh\core\_templates', '_templates'), (r'C:\Python27\Lib\site-packages\bokeh\server', 'server')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)

通过编辑此内容,我们确保所需的 compiler.js 已捆绑在 PyInstaller 可执行文件中。我们已经确保当程序运行时,compiler.py 文件会找到它。

希望这对将来遇到同样问题的人有所帮助!

关于python - 将 PyInstaller 与 Bokeh 和 CustomJS 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49619412/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com