TensorFlow 2.x加载中文路径模型报UnicodeEncodeError,因libtensorflow底层不支持宽字符路径;推荐用tf.io.gfile.GFile读取字节流绕过或建英文符号链接。

TensorFlow 2.x 加载含中文路径的模型直接报错 UnicodeEncodeError
TensorFlow(尤其是 2.15 及更早版本)底层 C++ 文件系统对非 ASCII 路径支持不完善,调用 tf.keras.models.load_model() 或 tf.saved_model.load() 时若路径含中文,常触发类似 UnicodeEncodeError: 'utf-8' codec can't encode characters... 或静默失败(返回 None)。这不是 Python 层编码问题,而是 TensorFlow 的 libtensorflow 在 Windows/Linux 下调用系统 API 时未正确处理宽字符路径。
绕过路径编码:用 tf.io.gfile.GFile 手动读取再加载
核心思路是避开 TensorFlow 自动解析路径的逻辑,改用其内部兼容性更好的文件接口读取字节流,再交由 Keras 解析。适用于 .h5 和 SavedModel 格式:
- 对
.h5模型:用tf.io.gfile.GFile以二进制模式打开,传给tf.keras.models.load_model()的custom_objects参数无关,但需指定compile=False避免重复编译引发的路径二次访问 - 对
SavedModel目录:不能直接传路径,必须先用tf.io.gfile.listdir()确认目录存在,再用tf.saved_model.load()—— 它对中文路径的支持略好于load_model(),但仍不稳定;更稳妥的是改用绝对路径的英文别名(见下一条) - 注意:
tf.io.gfile.GFile在 Windows 上对中文路径支持较好,Linux/macOS 下仍可能失败,此时需降级为符号链接方案
终极稳定方案:创建英文符号链接指向中文目录
这是生产环境最可靠的做法,完全规避 TensorFlow 的路径解析缺陷:
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- Windows:用管理员权限运行
mklink /D model_en "D:\我的模型\best_model" - Linux/macOS:运行
ln -s "/home/用户/我的模型/best_model" ./model_en - 之后所有代码中只使用
model_en这个纯英文路径,例如tf.keras.models.load_model("model_en") - 符号链接本身是操作系统级功能,TensorFlow 读取时看到的是标准 ASCII 路径,不再触发编码异常
- 注意:不要在 Jupyter Notebook 中动态创建链接后立刻加载——文件系统缓存可能导致首次访问失败,建议重启 kernel 或加
time.sleep(0.1)
为什么不用 os.environ["PYTHONIOENCODING"] = "utf-8" 或 sys.stdout.reconfigure()
这些设置只影响 Python 标准流的编码,对 TensorFlow 底层 C++ 的文件 I/O 无任何作用。实测设置后仍会报相同的 UnicodeEncodeError。同理,修改 locale 或在 IDE 中设置文件编码也无效——问题不在 Python 解释器,而在 libtensorflow.so/dll 的路径处理逻辑里。
立即学习“Python免费学习笔记(深入)”;
真正关键的不是“怎么告诉 Python 用 UTF-8”,而是“怎么让 TensorFlow 根本不碰那个中文字符串”。符号链接或字节流绕过才是直击要害的做法。路径里有中文本身没问题,但 TensorFlow 的旧版文件系统就是不认它。

















