如果还没有 PyPI 账号:
TestPyPI(测试环境):
- 注册:https://test.pypi.org/account/register/
- 用于测试上传,不会影响正式环境
PyPI(正式环境):
- 注册:https://pypi.org/account/register/
- 用于正式发布
TestPyPI:
- 登录 https://test.pypi.org
- 进入 Account settings → API tokens
- 点击 "Add API token"
- Token name:
quantbox-cn-test - Scope: 选择 "Entire account" 或特定项目
- 复制生成的 token(格式:
pypi-...)
PyPI:
- 登录 https://pypi.org
- 进入 Account settings → API tokens
- 点击 "Add API token"
- Token name:
quantbox-cn - Scope: 选择 "Entire account"(首次上传)或 "Project: quantbox-cn"(后续更新)
- 复制生成的 token
创建 ~/.pypirc 文件:
cat > ~/.pypirc << 'EOF'
[distutils]
index-servers =
pypi
testpypi
[pypi]
username = __token__
password = pypi-YOUR-ACTUAL-TOKEN-HERE
[testpypi]
repository = https://test.pypi.org/legacy/
username = __token__
password = pypi-YOUR-TEST-TOKEN-HERE
EOF
chmod 600 ~/.pypircuv run twine check dist/*输出应该是 PASSED
uv run twine upload --repository testpypi dist/*# 创建测试环境
python -m venv test_env
source test_env/bin/activate # Windows: test_env\Scripts\activate
# 从 TestPyPI 安装
pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ quantbox-cn
# 测试导入
python -c "from quantbox.services import MarketDataService; print('✅ 安装成功!')"
# 清理
deactivate
rm -rf test_env如果测试通过,上传到正式 PyPI:
uv run twine upload dist/*# 等待几分钟让 PyPI 同步
# 从正式 PyPI 安装
pip install quantbox-cn
# 测试
python -c "from quantbox.services import MarketDataService; print('✅ 发布成功!')"git tag -a v0.2.0 -m "Release v0.2.0"
git push origin v0.2.0- 访问 https://github.com/curiousbull/quantbox/releases
- 点击 "Draft a new release"
- 选择标签
v0.2.0 - Release title:
v0.2.0 - PyPI 首次发布 - 描述:复制 README.md 中的更新日志
- 附加文件(可选):
- quantbox-cn-0.2.0-py3-none-any.whl
- quantbox-cn-0.2.0.tar.gz
- 点击 "Publish release"
访问:https://pypi.org/project/quantbox-cn/
检查:
- ✅ README 显示正确
- ✅ 版本号正确 (0.2.0)
- ✅ 依赖列表完整
- ✅ 分类标签正确
- ✅ 项目链接正确
确保 README.md 中的 PyPI badge 显示正确:
[](https://pypi.org/project/quantbox-cn/)A: 检查:
- Token 是否正确配置在
~/.pypirc - Token 权限是否足够(首次上传需要 "Entire account" 权限)
- Token 是否已过期
A:
- 在 PyPI 搜索 "quantbox" 确认是否已存在
- 如果已存在,需要选择其他名称或联系原作者
- 如果是你自己的项目,使用对应项目的 Token
A:
- 确保 README.md 使用标准 Markdown 格式
- PyPI 支持的 Markdown 有限制,避免使用高级语法
- 可以用
twine check验证 README 渲染
A:
- 更新
pyproject.toml中的版本号(如0.2.1) - 重新构建:
uv build - 验证:
uv run twine check dist/* - 上传:
uv run twine upload dist/*
注意:相同版本号不能重复上传,必须更新版本号
A:
- PyPI 不支持删除已发布的版本
- 只能"yank"(标记为不推荐):在 PyPI 项目页面操作
- 如果确实需要删除,联系 PyPI 支持团队
- 更新版本号(pyproject.toml)
- 更新 CHANGELOG(README.md)
- 运行测试:
uv run pytest tests/ - 清理构建产物:
rm -rf dist/ build/ - 重新构建:
uv build - 验证包:
uv run twine check dist/* - 上传到 TestPyPI 测试
- 上传到正式 PyPI
- 创建 Git 标签
- 创建 GitHub Release
- 验证安装和功能
祝发布顺利! 🎉