[BUG] 1.6.0 版本存在导入错误:无法从 core/__init__.py 导入 DdddOcr
Author: hbjohnsanCreated Feb 4, 2026Updated Mar 25, 2026
问题描述
在 ddddocr 1.6.0 版本中存在导入错误,导致无法正常使用 DdddOcr 类。
环境信息
- 操作系统:Ubuntu 22.04(其他操作系统同样受影响)
- Python 版本:3.12.3(其他 Python 3.12 版本同样受影响)
- ddddocr 版本:1.6.0
- onnxruntime 版本:1.18.1
重现步骤
安装 ddddocr:
pip install ddddocr==1.6.0运行以下 Python 代码:
import ddddocr try: ocr = ddddocr.DdddOcr() print("初始化成功") except Exception as e: print(f"初始化失败: {e}")
预期行为
应该成功创建 ddddocr.DdddOcr() 实例。
实际行为
抛出以下错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
import ddddocr
File ".../site-packages/ddddocr/__init__.py", line 17, in <module>
from .core import DdddOcr
File ".../site-packages/ddddocr/core/__init__.py", line 10, in <module>
__all__ = [
NameError: name 'DdddOcr' is not defined问题分析
经过分析,发现以下问题:
问题 1:core/__init__.py 缺少 DdddOcr 导出
文件路径: ddddocr/core/__init__.py
当前内容:
from .base import BaseEngine
from .ocr_engine import OCREngine
from .detection_engine import DetectionEngine
from .slide_engine import SlideEngine
__all__ = [
'BaseEngine',
'OCREngine',
'DetectionEngine',
'SlideEngine',
'DdddOcr' # ❌ 这里引用了未导入的名称
]问题: DdddOcr 类实际位于 ddddocr.compat.legacy 模块中,但 core/__init__.py 试图将其包含在 __all__ 中而没有导入。
问题 2:__init__.py 导入了不存在的符号
文件路径: ddddocr/__init__.py
当前内容:
from .utils import (
ALLOWED_IMAGE_FORMATS, # ❌ 不存在
MAX_IMAGE_BYTES, # ❌ 不存在
MAX_IMAGE_SIDE, # ❌ 不存在
base64_to_image,
get_img_base64,
png_rgba_black_preprocess,
)问题: ALLOWED_IMAGE_FORMATS、MAX_IMAGE_BYTES、MAX_IMAGE_SIDE 等符号在 utils 模块中不存在。
问题 3:向后兼容性断裂
DdddOcr 类已经从主要模块移动到 compat.legacy 模块,但导入路径没有相应更新。
建议的修复方案
修复方案 1:修复 core/__init__.py
# coding=utf-8
"""
核心功能模块
提供OCR识别、目标检测、滑块匹配等核心功能
"""
from .base import BaseEngine
from .ocr_engine import OCREngine
from .detection_engine import DetectionEngine
from .slide_engine import SlideEngine
# 从 compat.legacy 导入 DdddOcr 以提供向后兼容
from ..compat.legacy import DdddOcr
__all__ = [
'BaseEngine',
'OCREngine',
'DetectionEngine',
'SlideEngine',
'DdddOcr' # ✅ 现在被正确导入
]修复方案 2:修复 __init__.py
# coding=utf-8
from .core import DdddOcr
from .utils import (
base64_to_image,
get_img_base64,
png_rgba_black_preprocess,
DDDDOCRError,
ModelLoadError,
ImageProcessError,
)
# 添加向后兼容的别名(如果需要)
DdddOcrInputError = DDDDOCRError
InvalidImageError = ImageProcessError
__all__ = [
"DdddOcr",
"base64_to_image",
"get_img_base64",
"png_rgba_black_preprocess",
"DDDDOCRError",
"ModelLoadError",
"ImageProcessError",
"DdddOcrInputError", # 向后兼容别名
"InvalidImageError", # 向后兼容别名
]修复方案 3:替代方案(如果需要保持原结构)
如果不想修改 core/__init__.py,可以修改 __init__.py 直接导入:
# 替代方案:直接从 compat.legacy 导入
from .compat.legacy import DdddOcr测试验证
测试脚本
import ddddocr
def test_imports():
"""测试所有必要的导入"""
print("测试 ddddocr 导入...")
# 测试主类导入
ocr = ddddocr.DdddOcr(show_ad=False)
print(f"✓ DdddOcr 类导入成功: {type(ocr).__name__}")
# 测试工具函数
from ddddocr.utils import base64_to_image, get_img_base64
print("✓ 工具函数导入成功")
# 测试错误类
from ddddocr.utils import DDDDOCRError, ModelLoadError, ImageProcessError
print("✓ 错误类导入成功")
print("\n✅ 所有测试通过!")
if __name__ == "__main__":
test_imports()测试结果
应用修复后预期输出:
✓ DdddOcr 类导入成功: DdddOcr
✓ 工具函数导入成功
✓ 错误类导入成功
✅ 所有测试通过!已创建的修复工具
我已经创建了一个自动修复工具,可以临时解决这个问题:
# 文件:tools/fix_ddddocr.py
"""
ddddocr 包自动修复工具
用于修复 1.6.0 版本的导入错误
"""
# 完整代码见附件使用方法:
python tools/fix_ddddocr.py这个工具会:
- 自动检测虚拟环境
- 找到 ddddocr 包路径
- 备份原文件
- 应用上述修复
- 验证修复结果
影响评估
影响范围
- 所有使用
ddddocr==1.6.0的用户 - 所有 Python 3.12 环境(可能也影响其他 Python 版本)
严重程度
- 严重性: 高(包完全无法使用)
- 影响: 100% 的用户会遇到此问题
向后兼容性
修复方案保持了向后兼容性:
- 现有的
ddddocr.DdddOcr()调用继续有效 - 现有的工具函数继续可用
- 错误类提供兼容性别名
愿意提供的帮助
我愿意:
- 提供完整的修复代码
- 提交 Pull Request
- 编写相关测试用例
- 帮助验证修复
附加信息
相关文件
ddddocr/__init__.py: 主模块文件ddddocr/core/__init__.py: 核心模块文件ddddocr/compat/legacy.py:DdddOcr类的实际位置ddddocr/utils.py: 工具函数模块
系统日志
$ python --version
Python 3.12.3
$ pip show ddddocr
Name: ddddocr
Version: 1.6.0
Summary: 带带弟弟ocr通用验证码识别SDK
Home-page: https://github.com/sml2h3/ddddocr
Author: sml2h3
Author-email: [email protected]
License: MIT
Location: /path/to/venv/lib/python3.12/site-packages
Requires: onnxruntime, Pillow, numpy摘要
问题: ddddocr 1.6.0 版本存在导入错误,导致无法使用 DdddOcr 类。
原因:
core/__init__.py在__all__中引用了未导入的DdddOcr__init__.py导入了utils模块中不存在的符号
解决方案:
- 在
core/__init__.py中正确导入DdddOcr类 - 从
__init__.py中移除不存在的导入 - 保持向后兼容性
优先级: 高(阻止所有用户使用)
可选添加的信息
如果你愿意,还可以添加以下信息:
我遇到的特定使用场景
在我的项目中,我需要使用 ddddocr 来处理验证码识别。这个错误阻止了我的整个项目运行。
我已尝试的解决方案
- 清理缓存并重新安装
- 尝试不同版本的 Python
- 查看源代码并手动修复(如上所述)
- 创建临时修复工具
建议的发布计划
- 发布紧急修复版本 1.6.1
- 或者发布 1.6.0.post1 作为补丁版本
- 更新 PyPI
上的版本说明
``
Source: sml2h3/ddddocr