首次在Streamlit Cloud部署Python应用遇.pkl文件目录报错
问题根因
Python读取相对路径文件时,路径基准是执行启动命令时的工作目录,不是app.py脚本自身的存放目录。哪怕.pkl文件和app.py在同一个文件夹,只要启动脚本时的工作目录不在这个文件夹下,直接写文件名加载就会报文件不存在。
修复方案
不要直接写裸文件名加载pkl,先动态获取app.py自身所在的绝对目录,再拼接pkl文件名生成完整绝对路径,这种写法不受启动目录影响,任何场景下都能准确定位文件。
替换原有加载pkl的代码为如下写法,记得把代码里的xxx.pkl换成你实际的pkl文件名:
import os import pickle # 获取app.py所在文件夹的绝对路径 script_directory = os.path.dirname(os.path.abspath(__file__)) # 拼接生成pkl文件的完整路径 pkl_path = os.path.join(script_directory, "xxx.pkl") # 加载pkl文件 with open(pkl_path, "rb") as f: model = pickle.load(f)
排查补充
- 部署到Linux服务器时要注意文件名大小写:Windows系统不区分文件名大小写,
Model.pkl和model.pkl会被识别为同一个文件,但Linux系统大小写敏感,文件名不匹配会直接报找不到,要确认代码里的文件名和实际文件名完全一致。 - 用Docker、Gunicorn、uWSGI等工具部署时,检查配置中的工作目录(WORKDIR)设置,避免工作目录和脚本存放目录层级错配。
- 定位路径问题时,可以临时在加载pkl的代码前加
print(os.getcwd()),启动后看输出日志就能知道程序默认的文件查找路径,快速确认路径偏差。
内容的提问来源于stack exchange,提问作者Eptehal Nashnoush
相关产品推荐
相关产品推荐

