You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyInstaller打包PySide6+pygraphviz应用遇路径及依赖问题

解决PyInstaller打包PySide6+pygraphviz应用的核心问题

一、修复打包时找不到neato等布局工具的错误

原hook-pygraphviz.py中使用os.path.realpath(shutil.which("dot"))解析路径时,Ubuntu 23.10下的符号链接会被错误指向/usr/sbin下的无关文件,导致PyInstaller定位布局工具失败。

修改hook文件(路径通常为venv/lib/pythonX.X/site-packages/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-pygraphviz.py,或你的PyInstaller hooks目录):
将原代码行:

graphviz_bindir = os.path.dirname(os.path.realpath(shutil.which("dot")))

替换为:

dot_path = shutil.which("dot")
if dot_path is not None:
    graphviz_bindir = os.path.dirname(dot_path)
else:
    raise Exception("Graphviz dot tool not found!")

直接使用dot的实际路径,跳过会出错的符号链接解析步骤。

二、修复运行时缺失Graphviz插件库的崩溃问题

打包成功后运行崩溃,是因为PyInstaller未自动收集Graphviz的插件库(如libgvplugin_pango.so.6、libgvplugin_gd.so.6),这些库默认存放在/usr/lib/x86_64-linux-gnu/graphviz/目录下。

方案1:修改hook文件自动收集插件

在hook-pygraphviz.py中添加以下代码:

import glob

# 适配Ubuntu 23.10的Graphviz插件目录
graphviz_plugin_dir = "/usr/lib/x86_64-linux-gnu/graphviz"
if os.path.exists(graphviz_plugin_dir):
    plugin_files = glob.glob(os.path.join(graphviz_plugin_dir, "*.so*"))
    for plugin in plugin_files:
        datas.append((plugin, "graphviz"))

保存后重新执行打包命令:

pyinstaller --onefile --noconsole stackedAPP.py

方案2:打包时手动指定额外数据

若不想修改hook,可直接在打包命令中添加插件目录:

pyinstaller --onefile --noconsole --add-data "/usr/lib/x86_64-linux-gnu/graphviz/*.so*:graphviz" stackedAPP.py

验证步骤

  1. 完成修改后重新打包
  2. 运行生成的可执行文件,测试pygraphviz绘图功能
  3. 若仍有缺失库问题,执行ldd /usr/bin/dot查看dot依赖的所有系统库,用--add-binary参数手动添加缺失项

内容的提问来源于stack exchange,提问作者dorito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:45:22