我正在使用PySide 6和pygraphviz创建一个简单的三个小部件桌面应用程序.当我使用pyinstaller --onefile --noconsole stackedAPP.py的时候,Python抛出了这个错误:Unable to find '/usr/sbin/neato' when adding binary and data files.看起来Python找不到任何的pygraphviz布局,不仅仅是neato,因为我也try 过使用其他的布局.这不是一个孤立的问题,因为我找到了in this older post个,但没有答案,所以我不得不再次问. 一个类似的Python错误here似乎在修改包的钩子后得到了解决,所以我try 查看hook-pygraphviz.py.

在我看来,错误出在返回/usr/sbin的行:graphviz_bindir = os.path.dirname(os.path.realpath(shutil.which("dot")))

在进一步调查后,我发现shutil.which('dot')个返回/usr/bin/dot个实际上是正确的(已手动确认).但os.path.realpath('/usr/bin/dot')的结果实际上完全是另一回事:

>>> import os
>>> import shutil
>>> shutil.which("dot")
'/usr/bin/dot'
>>> os.path.realpath('/usr/bin/dot')
'/usr/sbin/libgvc6-config-update'

因此,PyInstaller在/usr/sbin中找不到neato的原因是它不在/usr/sbin中,这就是它首先在/usr/sbin中搜索的原因. 所以我决定手动修改钩子,并将路径设置为graphviz_bindir = '/usr/bin' 这很有帮助,并成功编译了PyInstaller,但当我使用该应用程序时,当它进入使用pygraph viz的阶段时,它崩溃了,这是我看到的错误消息:

(stackedAPP:18070): GLib-GIO-CRITICAL **: 22:02:47.490: GFileInfo created without standard::icon

(stackedAPP:18070): GLib-GIO-CRITICAL **: 22:02:47.490: file ../../../gio/gfileinfo.c: line 1766 (g_file_info_get_icon): should not be reached
Traceback (most recent call last):
  File "processUI.py", line 127, in on_finished
  File "processUI.py", line 189, in generate_causal_loop_diagram
  File "pygraphviz/agraph.py", line 1613, in draw
  File "pygraphviz/agraph.py", line 1404, in _run_prog
OSError: Warning: Could not load "/tmp/_MEIsRtebz/graphviz/libgvplugin_pango.so.6" - file not found
Warning: Could not load "/tmp/_MEIsRtebz/graphviz/libgvplugin_pango.so.6" - file not found
Warning: Could not load "/tmp/_MEIsRtebz/graphviz/libgvplugin_pango.so.6" - file not found
Warning: Could not load "/tmp/_MEIsRtebz/graphviz/libgvplugin_pango.so.6" - file not found
Warning: Could not load "/tmp/_MEIsRtebz/graphviz/libgvplugin_gd.so.6" - file not found
Format: "png" not recognized. Use one of: bmp canon cmap cmapx cmapx_np dot dot_json eps fig gd gd2 gif gtk gv ico imap imap_np ismap jpe jpeg jpg json json0 mp pdf pic plain plain-ext png pov ps ps2 svg svgz tif tiff tk vdx vml vmlz vrml wbmp webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib

我不知道从现在开始该怎么做.我正在使用VirtualBox运行Ubuntu-23.10,我正在运行该进程.当我安装GRAPRIFIZ和PYGRIGVIZ时,我使用:

sudo apt-get graphviz graphviz-dev
pip install pygraphviz

如本documentation中所推荐的. 如有任何帮助,将不胜感激!

推荐答案

我发现一种仅获取应用程序的解决方法是使用cx_freeze

我运行了cxfreeze -c translator.py --target-dir dist,得到了一个运行没有任何错误的应用程序.我将不得不看一看CX_Freeze如何处理与PyInstaller不同的事情.

也可以使用pyinstaller,但我不得不略微修改了hooks/stdhooks/hook-pygraphviz.py.我修改了第graphviz_bindir = os.path.dirname(os.path.realpath(shutil.which("dot")))行到第graphviz_bindir = shutil.which('dot')行,并添加了动态Graphviz库,方法是找到graph viz所在的位置,然后使用来自pyinstaller的--Add-Binary参数.对我来说,大约是pyinstaller --onefile --add-binary /usr/lib/x86_64-linux-gnu/graphviz:graphviz main.py.

Python相关问答推荐

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

NP.round解算数据后NP.unique

如果条件不满足,我如何获得掩码的第一个索引并获得None?

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

SQLAlchemy Like ALL ORM analog

如何在UserSerializer中添加显式字段?

如何根据一列的值有条件地 Select 前N组?

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

python panda ExcelWriter切换动态公式到数组公式

如何杀死一个进程,我的Python可执行文件以sudo启动?

在matplotlib中使用不同大小的标记顶部添加批注

numpy数组和数组标量之间的不同行为

仅使用预先计算的排序获取排序元素

在Django中重命名我的表后,旧表中的项目不会被移动或删除

当输入是字典时,`pandas. concat`如何工作?

PYTHON中的selenium不会打开 chromium URL

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?

将参数从另一个python脚本中传递给main(argv

Fake pathlib.使用pyfakefs的类变量中的路径'