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
验证步骤
- 完成修改后重新打包
- 运行生成的可执行文件,测试pygraphviz绘图功能
- 若仍有缺失库问题,执行
ldd /usr/bin/dot查看dot依赖的所有系统库,用--add-binary参数手动添加缺失项
内容的提问来源于stack exchange,提问作者dorito
相关产品推荐
相关产品推荐

