加载pickle模型文件报EOFError: Ran out of input错误如何解决
EOFError: Ran out of input 报错原因及解决方案
报错原因
random_forest_regression_model.pkl文件为空或内容不完整。保存模型时程序提前终止、写入过程报错、跨设备传输文件时损坏都可能导致文件内容缺失,空文件加载时必然会触发该报错。- 路径不匹配。你代码中写的是相对路径,Flask服务启动时的工作目录和你存放pkl文件的目录不一致,
open()函数在找不到对应文件时会默认创建一个空的同名文件,后续读取空文件就会报错。 - 权限不足。当前运行Flask进程的用户没有该pkl文件的读取权限,无法读取到文件内容。
- 版本不兼容。保存模型时使用的Python版本、scikit-learn版本和当前运行环境的版本差异过大,会导致反序列化失败,部分场景下会抛出该EOF错误。
- 保存模型时未正确关闭文件句柄,导致写入的内容没有完全刷新到磁盘,最终存储的文件不完整。
解决方法
- 先校验pkl文件完整性
查看文件大小,如果文件大小为0字节,说明文件为空,需要重新训练并正确保存模型。保存模型时建议使用上下文管理器自动处理文件句柄的关闭,避免内容未刷入磁盘:
# 模型保存示例代码 with open('random_forest_regression_model.pkl', 'wb') as f: pickle.dump(训练完成的随机森林模型变量, f)
如果是跨设备传输导致的文件损坏,重新传输一次即可。
- 改用绝对路径加载模型
避免相对路径的工作目录适配问题,你可以先打印当前工作目录确认文件位置,再填入完整的绝对路径:
import os # 先打印当前Flask进程的工作目录,确认pkl文件是否存放在该路径下 print(os.getcwd()) # 加载时也使用上下文管理器,避免读取异常 with open('替换为你的pkl文件完整绝对路径', 'rb') as f: loaded_model = pickle.load(f)
调整文件读取权限
如果是权限问题导致读取失败,Linux/macOS环境下可以执行命令修改文件权限:chmod 644 random_forest_regression_model.pkl
Windows环境下右键文件属性,在安全选项中给当前用户开通读取权限即可。对齐依赖版本
确认训练模型时使用的Python、scikit-learn版本和当前Flask运行环境的版本保持一致,避免版本不兼容导致的反序列化失败。
内容的提问来源于stack exchange,提问作者Anil Dhage
相关产品推荐
相关产品推荐

