从GitHub到PyPI:ddddocr项目发布全流程
引言:验证码识别工具的发布密码
你是否曾为开源项目发布流程中的依赖管理、打包配置、版本控制而头疼?作为开发者,将本地项目转化为全球用户可通过pip install一键安装的PyPI包,需要跨越代码提交、环境配置、打包测试等多重障碍。本文以验证码识别领域的明星项目ddddocr(带带弟弟OCR)为例,系统拆解从GitHub代码管理到PyPI发布的全流程,包含10+关键配置文件解析、5大常见错误解决方案和3种自动化发布策略,助你掌握Python开源项目的标准化发布方法。
一、项目结构与核心配置解析
1.1 目录结构设计
ddddocr采用典型的Python项目结构,核心代码与资源文件分离,确保打包时的完整性:
ddddocr/
├── __init__.py # 包初始化文件
├── __main__.py # 命令行入口
├── common.onnx # 核心模型文件
├── common_det.onnx # 检测模型文件
├── core/ # 核心算法模块
│ ├── ocr_engine.py # OCR识别引擎
│ └── detection_engine.py # 目标检测引擎
├── api/ # API服务模块
└── utils/ # 工具函数集
1.2 setup.py核心配置
作为项目打包的核心配置文件,setup.py定义了包的元数据、依赖关系和安装规则:
from setuptools import setup, find_packages
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setup(
name="ddddocr", # PyPI包名
version="1.6.0", # 语义化版本号
author="sml2h3",
description="带带弟弟OCR",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/sml2h3/ddddocr", # 项目主页
packages=find_packages(), # 自动发现包
classifiers=[ # 分类信息,影响PyPI搜索结果
"Programming Language :: Python :: 3.7",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
install_requires=[ # 核心依赖
'numpy', 'onnxruntime', 'Pillow', 'opencv-python-headless'
],
extras_require={ # 可选依赖
'api': ['fastapi>=0.100.0', 'uvicorn[standard]>=0.20.0']
},
entry_points={ # 命令行入口配置
'console_scripts': [
'ddddocr=ddddocr.__main__:main',
],
},
)
1.3 MANIFEST.in资源文件管理
对于模型文件等非Python资源,需通过MANIFEST.in指定打包规则:
recursive-include ddddocr common.onnx
recursive-include ddddocr common_old.onnx
recursive-include ddddocr common_det.onnx
这条配置确保三个ONNX模型文件被正确打包,避免用户安装后出现"模型文件缺失"错误。
1.4 requirements.txt依赖管理
项目根目录的requirements.txt定义了开发环境依赖:
onnxruntime
onnx
Pillow
numpy<2.0.0
opencv-python==3.4.16.59
fastapi>=0.100.0
uvicorn[standard]>=0.20.0
pydantic>=2.0.0
注意版本限制策略:numpy<2.0.0采用上限限制避免不兼容更新,opencv-python==3.4.16.59使用精确版本确保算法稳定性。
二、从代码提交到PyPI发布的流程设计
2.1 版本控制与提交规范
采用语义化版本(Semantic Versioning)管理版本号:
- MAJOR(主版本):不兼容的API变更(1.0.0 → 2.0.0)
- MINOR(次版本):向后兼容的功能新增(1.5.0 → 1.6.0)
- PATCH(修订版):向后兼容的问题修复(1.6.0 → 1.6.1)
提交信息遵循Angular规范:
<type>(<scope>): <subject>
<body>
<footer>
常见type包括:feat(新功能)、fix(修复)、docs(文档)、style(格式)、refactor(重构)。
2.2 本地打包与测试
2.2.1 构建源码分发包
python setup.py sdist
生成.tar.gz格式的源码包,位于dist/目录下。
2.2.2 构建wheel包
python setup.py bdist_wheel
生成.whl格式的二进制包,支持更快的安装速度。
2.2.3 本地安装测试
pip install dist/ddddocr-1.6.0-py3-none-any.whl
测试包括:
- 命令行调用:
ddddocr --version验证入口正确性 - API功能测试:
import ddddocr; ocr = ddddocr.DdddOcr(); ocr.classification(open("test.png", "rb").read()) - 依赖完整性检查:
pip show ddddocr确认依赖是否正确安装
2.3 PyPI发布步骤
2.3.1 账号准备
- 在PyPI注册账号
- 创建API token(推荐)或获取用户名密码
2.3.2 安装发布工具
pip install twine setuptools wheel
2.3.3 上传包到PyPI
twine upload dist/*
输入API token(用户名留空,密码输入token)完成上传。
2.4 发布流程自动化(GitHub Actions)
创建.github/workflows/publish.yml实现自动发布:
name: Publish to PyPI
on:
release:
types: [published]
jobs:
build-and-publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build
run: python setup.py sdist bdist_wheel
- name: Publish
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
工作流触发条件:当GitHub Release被发布时自动执行,从secrets获取PyPI API token完成发布。
三、常见问题解决方案与最佳实践
3.1 资源文件打包问题
症状:安装后提示FileNotFoundError: common.onnx
原因:MANIFEST.in配置错误或未设置include_package_data=True
解决方案:
- 确认setup.py中包含:
include_package_data=True, install_package_data=True, - MANIFEST.in使用绝对路径或正确的相对路径
3.2 依赖冲突处理
案例:numpy 2.0.0发布后导致安装失败
预防方案:在setup.py中设置版本上限:
install_requires=['numpy<2.0.0', ...]
解决流程:
flowchart TD
A[用户报告ImportError] --> B[本地复现问题]
B --> C[确认冲突依赖版本]
C --> D[修改setup.py限制版本]
D --> E[发布新版本]
E --> F[通知用户升级]
3.3 跨平台兼容性
确保在不同操作系统上的兼容性:
- 使用
Operating System :: OS Independent分类 - 避免依赖系统级库,优先使用纯Python实现或二进制wheel
- 图像相关操作使用Pillow而非系统自带的图像处理库
四、项目维护与迭代策略
4.1 版本迭代计划
采用"主版本+长期支持版"并行策略:
- 主版本(Main Line):每季度发布,包含新功能
- 长期支持版(LTS):每年发布一个,支持18个月安全更新
版本路线图示例:
timeline
title ddddocr版本规划
2024 Q1 : 1.6.0 (LTS) - 基础OCR功能
2024 Q2 : 1.7.0 - 新增滑动验证码支持
2024 Q3 : 1.8.0 - 提升小字符识别率
2025 Q1 : 2.0.0 (LTS) - API重构,性能优化
4.2 用户反馈处理机制
建立三级反馈处理流程:
- 问题确认:通过
python -m ddddocr.check收集环境信息 - 优先级分类:P0(阻断性)、P1(功能异常)、P2(性能优化)
- 修复发布:P0问题24小时内发布hotfix,P1问题纳入下一迭代
五、总结与展望
本文系统讲解了ddddocr项目从GitHub到PyPI的完整发布流程,涵盖:
- 核心配置文件解析(setup.py/MANIFEST.in/requirements.txt)
- 标准化发布流程设计(版本控制→本地测试→PyPI上传)
- 自动化部署实现(GitHub Actions配置)
- 常见问题解决方案(资源打包/依赖冲突/跨平台兼容)
随着验证码技术的发展,ddddocr将持续迭代模型优化和功能扩展。未来版本计划引入:
- 多语言识别支持
- 模型轻量化方案
- 实时推理性能优化
掌握本文所述的发布流程和最佳实践,不仅能提升项目发布效率,更能显著降低用户使用门槛,让优秀的开源项目获得更广泛的应用。
附录:实用命令速查表
| 操作 | 命令 |
|---|---|
| 本地安装 | pip install -e . |
| 构建包 | python setup.py sdist bdist_wheel |
| 测试上传 | twine upload --repository-url https://test.pypi.org/legacy/ dist/* |
| 检查依赖冲突 | pip check ddddocr |
| 生成依赖清单 | pip freeze > requirements.txt |
提示:发布前务必执行
twine check dist/*验证包元数据完整性。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00