Heroku部署Dash应用出现H10崩溃及FileNotFoundError问题求助
Dash应用部署到Heroku触发H10崩溃报错FileNotFoundError
问题描述
尝试将第一个Dash应用部署到Heroku时,无论采用何种操作方式,始终触发H10 app crashed error。查看heroku logs时发现存在FileNotFoundError,怀疑该错误是导致应用崩溃的根本原因。
参考线上教程的文件夹内文件引用方法编写的读文件代码如下:
PATH = pathlib.Path(__file__).parent DATA_PATH = PATH.joinpath("../datasets").resolve() top_games = pd.read_csv(DATA_PATH.joinpath("topgames.csv"))
相关文件夹结构、代码与错误日志截图如下:
日志显示的核心错误信息:
FileNotFoundError: [Errno 2] No such file or directory: '/datasets/topgames.csv'
补充说明:
- 应用可成功部署到Heroku,但访问时出现应用错误、无任何内容展示
- 使用完全相同的文件结构在localhost本地运行时,应用可正常工作
- 项目完整代码仓库:Chess-Games-Analysis
解决方案
本地运行正常但Heroku环境报文件不存在,核心原因是相对路径../在Heroku运行环境下解析层级错误,或是数据集文件未被正确上传到Heroku服务器,按以下步骤排查修复:
- 排查文件上传规则
打开项目根目录的.gitignore文件,确认没有将datasets/目录、*.csv后缀文件加入忽略列表。Heroku基于git推送的内容构建运行环境,被git忽略的文件不会上传到服务器,必然触发文件找不到错误。 - 修正路径拼接逻辑
你日志里报错的路径是系统根目录下的/datasets/topgames.csv,说明../跳转多了一层:本地运行脚本时执行上下文可能在子目录,../datasets刚好能匹配到数据集位置,但Heroku通过gunicorn启动应用时默认工作目录是项目根目录,这时候写../datasets会跳出项目目录到系统根目录找文件,自然找不到。
替换原有路径代码为固定基于入口文件位置的解析逻辑,不要依赖运行时工作目录:
修改后先在本地验证可以正常读取文件,再推送部署到Heroku。import pathlib import pandas as pd # 获取当前入口app.py所在的绝对目录 BASE_PATH = pathlib.Path(__file__).parent.resolve() # 直接拼接数据集路径,避免跨层级../跳转 top_games = pd.read_csv(BASE_PATH.joinpath("datasets", "topgames.csv")) - 路径仍不对时加调试日志定位
如果修改后还是报错,在读取文件前加一行临时调试代码,打印当前目录下的文件列表:
重新部署后执行# 临时调试用,问题解决后可删除 print("当前入口目录文件列表:", list(BASE_PATH.iterdir()))heroku logs --tail查看实时日志,就能明确看到datasets文件夹的实际位置,对应调整路径拼接规则即可。 - 排查其他可能触发H10错误的配置问题
确认项目根目录下三个Heroku必需的配置文件内容正确:requirements.txt:列全所有依赖,包含dash、pandas、gunicornProcfile:内容为web: gunicorn app:server(入口文件名为app.py时使用该配置)runtime.txt:填写和本地运行一致的Python版本,避免版本兼容问题
内容的提问来源于stack exchange,提问作者Kasheme
相关产品推荐
相关产品推荐

