PyInstaller 打包 Pygal 时出现闪退问题如何解决?
自己写了一个统计历史天气的小程序,想以柱状图的方式展示结果,在终端运行正常。 现在想把它打包成桌面,同事也可以用,但是似乎 PyInstaller 和 Pygal 兼容性不好,打包运行到 svg 渲染的模块就会闪退(我尝试把.render_to_file 的代码去掉,程序可以正常运行),请问各位大神有没有办法解决这个问题。
def display_bars(result_dict, title, description):
"""Generate pygal bars for the result"""
filename = title + '.svg'
bar = pygal.Bar()
bar.title = title
bar.x_labels = [x for x in result_dict.keys()]
bar.add(description, [x for x in result_dict.values()])
# bar.render_to_file(filename)
PyInstaller 打包 Pygal 时出现闪退问题如何解决?
PyInstaller 打包 Pygal 应用时闪退,通常是运行时缺少依赖资源导致的。Pygal 依赖一些静态文件(如图表模板),打包时不会自动包含它们。核心问题是 pygal 包的 data 目录没有被正确打包进最终的可执行文件。
解决方案:
你需要通过修改 .spec 文件,显式地将 pygal 的数据文件添加到打包资源中。
具体步骤:
-
首先生成
.spec文件(如果还没有):pyi-makespec your_script.py -
编辑生成的
your_script.spec文件: 找到Analysis部分,在datas列表中添加pygal数据目录的路径。你需要找到你环境中pygal包的安装位置。通常可以通过pip show -f pygal或在 Python 交互环境中执行以下代码来定位:import pygal, os print(os.path.join(os.path.dirname(pygal.__file__), 'data'))假设找到的路径是
/your/env/path/site-packages/pygal/data。修改
.spec文件如下:# your_script.spec a = Analysis( ['your_script.py'], pathex=[], binaries=[], datas=[('/your/env/path/site-packages/pygal/data', 'pygal/data')], # 添加这一行 hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, )关键点:
datas列表中的元组(源路径, 目标相对路径)告诉 PyInstaller 将源文件夹(或文件)复制到可执行文件运行时的临时目录下的对应位置。这里'pygal/data'是目标路径,意味着运行时pygal模块会在其同级目录下寻找data文件夹。 -
使用修改后的
.spec文件进行打包:pyinstaller your_script.spec
原理说明:Pygal 在渲染图表时会加载其 data 目录下的 CSS、JS 等模板文件。当直接运行 Python 脚本时,这些文件在安装的包目录中。但 PyInstaller 默认只打包 Python 代码和显式导入的模块,不会自动包含这些数据文件,导致打包后的程序在尝试访问这些资源时失败并闪退。通过修改 datas 配置,我们手动将这些必要的资源文件捆绑进可执行文件。
一句话建议:修改 .spec 文件,将 pygal 的 data 目录添加到 datas 中即可。

