PermissionError: [Errno 13] Permission denied 表明目标路径无写入权限,非代码逻辑问题;需确认路径可写(Linux/macOS用ls -ld、Windows查安全属性),避免相对路径歧义,优先用绝对路径并提前os.makedirs()校验,注意SavedModel需目录创建+写入权限、h5格式仅需文件写入且路径须以.h5结尾。

TensorFlow模型保存失败如果报 PermissionError: [Errno 13] Permission denied,基本就是目标路径没有写入权限,不是代码逻辑问题,别浪费时间查 tf.keras.models.save_model() 参数。
确认保存路径是否可写
Linux/macOS 下用 ls -ld /path/to/save 看目录权限;Windows 下右键属性 → 安全 → 检查当前用户是否有“写入”权限。尤其注意:如果路径是相对路径(比如 "./models/my_model"),实际写入位置取决于当前工作目录(os.getcwd()),而非脚本所在目录。
- 运行前先执行
import os; print(os.getcwd())确认当前路径 - 避免直接保存到系统目录(如
/usr/local/、C:\Program Files\)或只读挂载点 - 推荐显式使用绝对路径,并提前创建目录:
os.makedirs("/tmp/my_model", exist_ok=True)
检查TensorFlow保存方式与路径类型匹配
tf.keras.models.save_model() 默认保存为 SavedModel 格式(目录结构),需要对目标路径有**目录创建 + 文件写入**双重权限;若指定 save_format="h5",则只需文件级写入权限,但路径必须以 .h5 结尾。
- 错误写法:
model.save("models/")→ 路径末尾带斜杠,TF 会尝试创建目录,但若models/不存在且父目录不可写,就崩 - 正确写法:
model.save("/home/user/my_model")(自动建目录)或model.save("/home/user/model.h5", save_format="h5") - Windows 上路径分隔符用
/或os.path.join(),别硬写\(容易被当成转义字符)
容器或受限环境下的典型陷阱
Docker 中默认工作目录常为 /app,若镜像未声明 VOLUME 或未用 -v 挂载宿主机目录,/app 可能是只读的。Jupyter Notebook 后端进程用户(如 jovyan)也可能无权写入某些路径。
立即学习“Python免费学习笔记(深入)”;
- 在 Dockerfile 中加:
RUN mkdir -p /workspace && chown -R jovyan:jovyan /workspace,然后model.save("/workspace/my_model") - Jupyter 中优先保存到
~/work/或./output/这类明确属于当前用户的路径 - 避免依赖
~符号:Python 的os.path.expanduser("~")在某些容器里可能返回空或错误路径
真正卡住的往往不是 TensorFlow 本身,而是你没意识到保存路径最终落在哪个文件系统、由哪个用户身份执行、以及该路径是否真的允许创建子目录——把 os.makedirs() 和 os.access(path, os.W_OK) 加到保存前做校验,比反复重试更省时间。


















