一、背景与问题

接到一个 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 匹配),直接替换原文件。

操作步骤

  1. 进入 Python 环境目录:

    text

    C:\Python38\Lib\site-packages\onnxruntime\capi\
  2. 备份原始的两个文件。

  3. 将下载的兼容版本复制进去覆盖。

  4. 重新运行测试脚本。

python

import ddddocr
print("导入成功!")
ocr = ddddocr.DdddOcr()
print("OCR 对象创建成功")

输出

text

导入成功!
OCR 对象创建成功

至此,问题彻底解决。


八、最终可用的环境版本清单

包名版本
Python3.8.10 (64位)
ddddocr1.5.6
onnxruntime1.14.1
numpy1.26.4
opencv-python-headless4.5.5.64
pyreadline33.4.0
其他依赖自动匹配

关键:onnxruntime 必须使用 1.14.1 并替换两个 DLL/PYD 文件,numpy 必须低于 2.0。


九、避坑总结与建议

9.1 离线部署核心步骤

  1. 精准匹配平台pip download 时务必指定 --platform win_amd64 和 --python-version 3.8

  2. 依赖完整性检查:使用 pip download 后,手动检查是否缺失 pyreadline3 这类 Windows 特定依赖。

  3. 版本锁定:不要盲目装最新,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 包。

更多推荐