Pyinstaller打包Plotly仪表盘运行提示找不到package-info.json如何解决
问题根因
FileNotFoundError报错核心原因是PyInstaller默认仅打包Python可执行代码,不会自动收集Dash生态库(dash、dash-core-components/dcc、dash-html-components等)的非Python资源文件,包括你报错中的
package-info.json,以及各类JS、CSS静态资源。你之前配置的hiddenimports仅能解决Python模块导入缺失问题,无法覆盖资源文件收集的需求。
解决步骤
方案1:使用官方预配置钩子(操作最简单)
- 先安装PyInstaller官方贡献的钩子集合包,内置Dash全量资源收集规则:
pip install pyinstaller-hooks-contrib - 清理之前生成的
build、dist文件夹和旧spec文件,重新运行打包命令即可,如果是onedir模式直接用:pyinstaller --onedir run_dashboard.py
方案2:手动修改spec文件配置
如果不想安装额外包,可直接修改你的现有spec文件补充资源配置:
- 在
Analysis代码块前添加资源收集逻辑,把Dash相关资源和你自己的csv文件都纳入打包列表:
from PyInstaller.utils.hooks import collect_data_files # 收集Dash生态的所有资源文件 dash_datas = collect_data_files('dash') dcc_datas = collect_data_files('dash.dcc') html_datas = collect_data_files('dash.html') # 若使用dash-bootstrap-components,额外添加下面一行 # dbc_datas = collect_data_files('dash_bootstrap_components') # 合并资源,同时添加你自己的csv文件 # 示例中csv放在项目根目录的data文件夹下,你可以按实际路径修改 added_data = [] added_data += dash_datas + dcc_datas + html_datas added_data += [('./data/*.csv', './data')]
- 补全
hiddenimports配置,删除不必要的os(标准库不会被漏打包),补充Dash相关模块:
hiddenimports=['numpy', 'dash', 'dash.dcc', 'dash.html', 'dash_renderer']
- 补充代码中的路径兼容逻辑,避免读不到打包后的csv文件,在你的
run_dashboard.py开头添加以下代码:
import sys import os if getattr(sys, 'frozen', False): # 打包后运行环境,切换工作路径到exe解压/存放目录 base_path = sys._MEIPASS os.chdir(base_path) else: # 开发环境路径 base_path = os.path.dirname(os.path.abspath(__file__)) # 后续所有文件读取都用os.path.join拼接路径,比如读csv: # df = pd.read_csv(os.path.join(base_path, 'data/xxx.csv'))
- 清理旧的
build、dist文件夹,用spec文件执行打包:pyinstaller run_dashboard.spec
额外注意事项
- 优先调试通
--onedir模式的包再尝试--onefile模式,onefile模式每次运行会把所有资源解压到临时目录,路径适配规则和onedir一致,但首次启动速度更慢。 - 运行exe时如果还是闪退,可以先打开cmd,把exe拖到cmd窗口回车运行,就能看到完整报错信息,方便定位问题。
内容的提问来源于stack exchange,提问作者Andres
相关产品推荐
相关产品推荐

