实战指南:Windows 7 离线部署 ddddocr + onnxruntime 踩坑全记录
一、背景与问题
接到一个 RPA 项目,需要在一台 Windows 7 SP1 64 位、无法联网的工控机上运行验证码识别。
选型自然是 ddddocr(带枪弹验证码识别库),它依赖 onnxruntime 做深度学习推理。
本以为 pip download 打包离线安装就完事,结果 import ddddocr 时直接崩溃:
python
ImportError: DLL load failed while importing onnxruntime_pybind11_state: 找不到指定的程序。
环境信息:
-
操作系统:Windows 7 64 位
-
Python:3.8.10 (64 位)
-
目标库:ddddocr
二、第一阶段:离线包准备与初次安装
2.1 使用 pip download 打包依赖
在联网机器上(需与目标环境 Python 版本和系统架构一致):
bash
mkdir ddddocr_packages pip download ddddocr -d ./ddddocr_packages \ --platform win_amd64 \ --python-version 3.8 \ --only-binary=:all:
--only-binary=:all:强制下载预编译的.whl,避免目标机无法编译。
得到的包列表(关键几个):
text
ddddocr-1.5.6-py3-none-any.whl onnxruntime-1.12.1-cp38-cp38-win_amd64.whl numpy-1.23.4-cp38-cp38-win_amd64.whl opencv_python_headless-4.5.5.64-cp36-abi3-win_amd64.whl ...
2.2 离线安装
将文件夹复制到目标机,执行:
bash
pip install --no-index --find-links=./ddddocr_packages ddddocr
安装成功,没有报错。但一导入就炸 —— 经典开局。
三、第一个坑:humanfriendly 依赖 pyreadline3 缺失
安装日志中其实有警告,只是被淹没了:
text
ERROR: No matching distribution found for pyreadline3; sys_platform == "win32" and python_version >= "3.8"
原因:humanfriendly 在 Windows 上需要 pyreadline3,但 pip download 时因为某些索引问题没有拉下来。
解决:手动下载 pyreadline3-3.4.0-py3-none-any.whl,放入 packages 文件夹,重新执行安装命令即可。
四、第二个坑:onnxruntime DLL 加载失败 —— 噩梦的开始
安装完成后,import ddddocr 报错:
text
ImportError: DLL load failed while importing onnxruntime_pybind11_state: 找不到指定的程序。
定位到 onnxruntime_pybind11_state.pyd 这个文件(位于 site-packages/onnxruntime/capi/)加载失败。
4.1 尝试安装 VC++ Redistributable
网上搜一圈,都说缺少 VC++ 运行库。下载安装 vc_redist.x64.exe(2015-2022 版本),重启,问题依旧。
安装 vcredist_x64.exe 多个版本(2015、2017、2019、2022),全部无效。
说明不是简单的运行库缺失,而是 onnxruntime 版本与 Windows 7 存在深层不兼容。
4.2 查阅资料得知:onnxruntime 从 1.15.0 开始放弃 Win7
微软官方在 1.15.0 的 Release Note 中明确:
Starting from 1.15.0, Windows 7 is no longer supported.
我下载的 1.12.1 按理应该支持 Win7,但实测依然失败。经过社区反馈,真正稳定的 Win7 版本是 1.14.1 及更早。
五、第三阶段:降级 onnxruntime 到 1.14.1
5.1 下载 1.14.1 离线包
bash
pip download onnxruntime==1.14.1 \ --only-binary=:all: \ --platform win_amd64 \ --python-version 3.8 \ -d ./onnxruntime_1.14.1_pkgs
得到 onnxruntime-1.14.1-cp38-cp38-win_amd64.whl。
5.2 卸载旧版本,安装新版本
bash
pip uninstall onnxruntime pip install --no-index --find-links=./onnxruntime_1.14.1_pkgs onnxruntime==1.14.1
再次 import ddddocr,报错依然存在,但这次错误位置略有变化(DLL 依赖不同)。
六、第三个坑:numpy 版本冲突
检查环境发现 numpy 是 2.0 版本(因为之前为了别的项目升级过)。
而 ddddocr 依赖的 onnxruntime 底层是用 numpy 1.x 的 ABI 编译的,numpy 2.0 完全不兼容。
错误可能表现为:
text
AttributeError: _ARRAY_API not found
或依然 DLL 报错。
解决:降级 numpy 到 1.x 稳定版。
bash
pip uninstall numpy pip install numpy==1.26.4
注意:numpy 1.26.4 是最后一个支持 Python 3.8 的 1.x 版本。
降级后,import ddddocr 依然报错,但已经进步到可以加载 onnxruntime 了 —— 说明问题正在缩小,到这一步基本上已经成功了。
七、如果仍报错,所有环境重装后,手动替换文件:替换两个关键 DLL/PYD 文件
经过反复对比,发现在 onnxruntime==1.14.1 的安装目录下,有两个文件存在版本兼容性问题:
-
onnxruntime_providers_shared.dll -
onnxruntime_pybind11_state.pyd
从某开源社区找到一份针对 Windows 7 + Python 3.8 编译好的这两个文件(版本号 1.14.1 匹配),直接替换原文件。
操作步骤:
-
进入 Python 环境目录:
text
C:\Python38\Lib\site-packages\onnxruntime\capi\
-
备份原始的两个文件。
-
将下载的兼容版本复制进去覆盖。
-
重新运行测试脚本。
python
import ddddocr
print("导入成功!")
ocr = ddddocr.DdddOcr()
print("OCR 对象创建成功")
输出:
text
导入成功! OCR 对象创建成功
至此,问题彻底解决。
八、最终可用的环境版本清单
| 包名 | 版本 |
|---|---|
| Python | 3.8.10 (64位) |
| ddddocr | 1.5.6 |
| onnxruntime | 1.14.1 |
| numpy | 1.26.4 |
| opencv-python-headless | 4.5.5.64 |
| pyreadline3 | 3.4.0 |
| 其他依赖 | 自动匹配 |
关键:onnxruntime 必须使用 1.14.1 并替换两个 DLL/PYD 文件,numpy 必须低于 2.0。
九、避坑总结与建议
9.1 离线部署核心步骤
-
精准匹配平台:
pip download时务必指定--platform win_amd64和--python-version 3.8。 -
依赖完整性检查:使用
pip download后,手动检查是否缺失pyreadline3这类 Windows 特定依赖。 -
版本锁定:不要盲目装最新,Windows 7 环境建议:
-
onnxruntime <= 1.14.1 -
numpy >=1.16 -
ddddocr最新版(1.5.6 及以上均可)
-
9.2 如果替换 DLL 不起作用
可以尝试自己从源码编译 onnxruntime 1.14.1(较麻烦),或者使用 Anaconda 环境,其自带的依赖管理有时能绕过这些问题。
9.3 对 Windows 7 的最后忠告
微软早已停止支持 Win7,新版本的 Python 和许多库都会逐步抛弃它。如果业务允许,强烈建议升级到 Win10/11。如果必须坚守,请做好“手工修补”的准备。
十、资源下载
为了方便后来者,我将整理好的离线包(包含 ddddocr、onnxruntime 1.14.1 Win7 兼容版、numpy 1.26.4 等)打包上传,需要的朋友可以留言索取。
我用夸克网盘给你分享了「ddddocr_packages」,点击链接或复制整段内容,打开「夸克APP」即可获取。
/~3bef3YA1mB~:/
链接:https://pan.quark.cn/s/658075325381?pwd=BLxB
提取码:BLxB
写在最后
折腾半天,踩遍 Win7 离线部署的坑,最终靠降版本 / 替换文件搞定。希望这篇记录能帮你省下几个小时的 debug 时间。
如果你也遇到类似问题,欢迎在评论区交流。
愿天下没有难装的 Python 包。
更多推荐
所有评论(0)