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 时出现闪退问题如何解决?

1 回复

PyInstaller 打包 Pygal 应用时闪退,通常是运行时缺少依赖资源导致的。Pygal 依赖一些静态文件(如图表模板),打包时不会自动包含它们。核心问题是 pygal 包的 data 目录没有被正确打包进最终的可执行文件。

解决方案: 你需要通过修改 .spec 文件,显式地将 pygal 的数据文件添加到打包资源中。

具体步骤:

  1. 首先生成 .spec 文件(如果还没有):

    pyi-makespec your_script.py
    
  2. 编辑生成的 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 文件夹。

  3. 使用修改后的 .spec 文件进行打包

    pyinstaller your_script.spec
    

原理说明:Pygal 在渲染图表时会加载其 data 目录下的 CSS、JS 等模板文件。当直接运行 Python 脚本时,这些文件在安装的包目录中。但 PyInstaller 默认只打包 Python 代码和显式导入的模块,不会自动包含这些数据文件,导致打包后的程序在尝试访问这些资源时失败并闪退。通过修改 datas 配置,我们手动将这些必要的资源文件捆绑进可执行文件。

一句话建议:修改 .spec 文件,将 pygaldata 目录添加到 datas 中即可。

回到顶部