在上一篇从零开始制作年轻人的第一款pip包 中我们介绍了如何通过通过最常见的方式发布一个pip包,一年过去了,今年我们整点新活,用uv进行发布!
什么是uv
uv是一个最近新出的工具,可用于python版本管理、虚拟环境管理、管理安装pip包、项目部署、配置同步等等
当然,最重要的原因只有一个字——快!

先安装uv
如果你已经有python了,非常简单
pip install uv完事😎
当然你也可以通过其他方式安装,详见Installation | uv
新建一个uv项目
新建一个文件夹,然后创建虚拟环境,然后初始化uv项目
uv venv -p 3.10 #指定项目的python版本
uv init虚拟环境默认安装在执行路径的.venv文件夹,激活虚拟环境,就可以直接使用了
source .venv/bin/activate #macos
#.venv/python/activate.exe #windows比如这样
❯ source .venv/bin/activate
❯ which python
/Users/ww/coding/ocr-cli/.venv/bin/python同时你也会看到当前路径下多了一个pyproject.toml文件,这里记录了这个uv项目的相关信息
如果你需要给这个项目增加一些依赖包,使用
uv add pip包名接下来用这个虚拟环境开发好你的pip包,本教程跳过这一环节,默认你已经开发好且测试好了
用uv 构建并发布pip包到pypi
在前面通过uv init创建的pyproject.toml,就可以取代传统的setup.py,如果你不熟悉setup.py,请复习一下从零开始制作年轻人的第一款pip包
除了uv专用的一些功能,针对pip包的部分写法基本是一致的,具体请看Packaging Python Projects - Python Packaging User Guide
比如我的pyproject.toml长这样(简化后)
requires = ["setuptools>=45", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "deepseek-ocr-cliv2"
version = "0.1.3"
description = "ocr识别命令行工具"
readme = "README.md"
requires-python = ">=3.10"
license = { file = "LICENSE" }
classifiers = [
"License :: Other/Proprietary License",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12"
]
dependencies = [
"requests>=2.32.5",
]
[project.urls]
Homepage = "https://github.com/whitewatercn/deepseek-ocr-cli"
Repository = "https://github.com/whitewatercn/deepseek-ocr-cli"
[project.scripts]
dsocr = "dsocr.main:main"
[tool.setuptools.package-dir]
dsocr = "dsocr_core/dsocr"
[tool.setuptools.packages.find]
where = ["dsocr_core"]
include = ["dsocr*"]接下来就可以build了,你不需要安装wheel twine这两个pip包,直接使用uv内置的功能就行
uv build -o ./dist
# -o指定输出目录⚠️注意后面一定要加参数 -o ./dist,不然会构建到home目录里去,publish时找不到构建出来的内容
这时你就会看到/dist文件夹下两个文件
❯ ls dist
deepseek_ocr_cliv2-0.1.4-py3-none-any.whl
deepseek_ocr_cliv2-0.1.4.tar.gz然后用uv内置的功能发布,下面这样就发布成功了!
❯ uv publish
Publishing 2 files to https://upload.pypi.org/legacy/
Enter username ('__token__' if using a token): __token__
Enter password:
Uploading deepseek_ocr_cliv2-0.1.4-py3-none-any.whl (5.2KiB)
Uploading deepseek_ocr_cliv2-0.1.4.tar.gz (4.2KiB)⚠️本文撰写的时候,pypi已经不允许通过账户、密码发布了,必须通过token发布,如何获取token详见从零开始制作年轻人的第一款pip包
撒花庆祝
比起通过twine发布的方式,uv build 和 publish都快了很多
你可以尝试修改我的源码whitewatercn/deepseek-ocr-cli,自己发布一下
本来想写一个使用硅基流动apikey调用deepseekocr的api,写完才发现已经有一堆人发布了,本项目中止😅
https://pypi.org/search/?q=deepseek-ocr

