pytorch torch.load() 在 windows 下读取中文路径模型失败,本质是底层 c++ 路径解析使用 utf-8 而系统默认 ansi 编码(如 gbk)不兼容;应改用 open("rb") 手动读取文件对象传入 torch.load(),避免路径经由 c++ 解析。

PyTorch torch.load() 读取含中文路径模型失败
直接报错 OSError: [Errno 22] Invalid argument 或静默返回空字典,本质是 Windows 下默认 ANSI 编码(如 GBK)与 PyTorch 底层 C++ 调用的 UTF-8 路径处理不一致。Linux/macOS 一般无此问题,但跨平台部署时仍需统一处理。
关键不是改 Python 的 sys.getdefaultencoding(),而是绕过 PyTorch 对原始路径字符串的底层解析。实操建议:
- 用
open()手动以二进制模式读取文件,再传给torch.load()—— 这样路径只用于 Python 层打开,不经过 PyTorch 的 C++ 路径解析 - 示例:
f = open(r"模型\分类器_测试版.pth", "rb")<br>state_dict = torch.load(f, map_location="cpu")<br>f.close()
- 注意:必须用
"rb"模式,且不能用with open(...) as f:自动关闭(某些旧版本 PyTorch 会提前关闭文件句柄导致读取失败)
使用 pathlib.Path 构造路径时仍报错?
pathlib 本身不解决编码问题,它只是封装了字符串操作。当你把 Path 对象直接传给 torch.load(),底层仍会调用 C++ 的路径解析逻辑,中文字符照样崩。
正确做法是显式转成绝对路径字符串,并确保其编码能被系统 API 接受:
- Windows 上优先用
str(Path(...).resolve()),避免相对路径或符号链接引入额外编码歧义 - 若仍失败,强制用
os.path.normpath()归一化路径分隔符(把/全转成\),再传入torch.load() - 不要依赖
Path.as_posix()—— 它生成 Unix 风格路径,在 Windows 下可能触发底层路径校验异常
模型保存时就该规避路径编码风险
与其加载时补救,不如保存时就切断隐患。PyTorch 的 torch.save() 同样走同一套底层路径逻辑,所以保存阶段遇到中文路径也会出问题(尤其在多线程/子进程中)。
推荐保存策略:
- 统一用英文路径 + 时间戳或哈希命名,例如
"models/model_v1_20240521_abc123.pth" - 若必须保留语义信息,用拼音或 URL 编码替代中文:
"models/fenlei_qi_2024.pth"或"models/%E5%88%86%E7%B1%BB%E5%99%A8.pth" - 保存前检查路径是否存在:用
os.makedirs(os.path.dirname(path), exist_ok=True),避免因父目录含中文导致创建失败连带影响保存
第三方库(如 Hugging Face transformers)加载模型也卡在路径上?
这类库底层仍调用 torch.load(),所以同样踩坑。但它们通常提供更灵活的加载入口,比如 from_pretrained() 支持传入已打开的文件对象。
绕过方式一致:
- 手动用
open(..., "rb")打开模型文件或配置文件 - 传给对应加载函数的
file_obj或fp参数(具体名看文档,如AutoModel.from_pretrained(..., file_obj=f)) - 注意:部分库要求同时提供
config和state_dict分离加载,此时需分别对config.json和pytorch_model.bin做同样处理
真正麻烦的是那些硬编码路径、不暴露文件句柄接口的封装函数——只能改源码或换路径,没得绕。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











