文章目录
- [build-system] requires = [“setuptools>=61.0”, “wheel”] build-backend = “setuptools.build_meta” [project] name = “your-package-name” version = “0.1.0” authors = [ {name = “Your Name”, email = “you@example.com”} ] description = “A short description of your package” readme = {file = “README.md”, content-type = “text/markdown”} license = {text = “MIT”} classifiers = [ “Programming Language :: Python :: 3”, “License :: OSI Approved :: MIT License”, “Operating System :: OS Independent”, ] requires-python = “>=3.7” dependencies = [ “click>=8.1”, ] [project.urls] Homepage = “https://github.com/yourusername/your-package” [project.scripts] your-command = “your_package.module:main” [tool.setuptools] packages = {find = {}}
- 关键字段说明: name: PyPI 包名(使用连字符 -) version: 遵循语义化版本控制 readme: 支持 Markdown 或 reStructuredText classifiers: 帮助用户找到你的包 requires-python: 指定 Python 版本兼容性 包名约定: PyPI 包名:your-package-name(使用连字符) 导入模块名:your_package(使用下划线) 用户通过 import your_package 导入
- ERROR: InvalidDistribution: Metadata is missing required fields: Name, Version 解决方案: # 升级 twine 到最新版本 pip install –upgrade twine # 使用模块方式运行 python -m twine check dist/*
- HTTPError: 400 Client Error: The name ‘your-package’ is already in use 解决方案: 在 pyproject.toml 中修改 name 字段 确保包名在 PyPI 上唯一
- HTTPError: 400 Client Error: File already exists 解决方案: 在 pyproject.toml 中更新 version 字段 删除已上传的错误版本(通过 PyPI 管理界面)
- [tool.setuptools] include-package-data = true [tool.setuptools.package-data] “your_package.data” = [“*.json”, “*.txt”]
- [project.optional-dependencies] dev = [“pytest>=6.0”, “black”] gui = [“tkinter”, “pyqt5”]
- [project.scripts] my-cli = “my_package:main” [project.gui-scripts] my-gui = “my_package.gui:main”
目录
- 📦 项目配置
- 基础 pyproject.toml 配置
- 完整配置说明
- 🛠️ 工具安装
- 🔨 构建流程
- 1. 清理构建环境
- 2. 构建包
- 3. 验证包
- 🚀 发布到 PyPI
- 1. 准备 PyPI 账号
- 2. 上传包
- 3. 测试安装
- 🧪 测试环境发布
- 🐛 常见问题解决
- 1. 元数据缺失错误
- 2. 包名冲突
- 3. 版本冲突
- 📋 发布检查清单
- 🔄 版本管理最佳实践
- 💡 高级配置
- 包含数据文件
- 可选依赖项
- 多平台脚本
- 🌟 总结
本文将详细介绍如何使用 pyproject.toml 配置将 Python 包发布到 PyPI,包括完整的配置示例、构建命令和故障排除方法。
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "your-package-name"
version = "0.1.0"
authors = [
{name = "Your Name", email = "you@example.com"}
]
description = "A short description of your package"
readme = {file = "README.md", content-type = "text/markdown"}
license = {text = "MIT"}
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
requires-python = ">=3.7"
dependencies = [
"click>=8.1",
]
[project.urls]
Homepage = "https://github.com/yourusername/your-package"
[project.scripts]
your-command = "your_package.module:main"
[tool.setuptools]
packages = {find = {}}
关键字段说明:
name: PyPI 包名(使用连字符-)version: 遵循语义化版本控制readme: 支持 Markdown 或 reStructuredTextclassifiers: 帮助用户找到你的包requires-python: 指定 Python 版本兼容性
包名约定:
- PyPI 包名:
your-package-name(使用连字符) - 导入模块名:
your_package(使用下划线) - 用户通过
import your_package导入
# 安装构建和上传工具
pip install --upgrade build twine setuptools wheel
# 验证安装
python -m build --version
twine --version
# 清理旧的构建文件
rm -rf dist/ build/ *.egg-info/
# 构建源码包和 wheel 包
python -m build
# 构建结果
ls dist/
# your-package-name-0.1.0.tar.gz
# your-package-name-0.1.0-py3-none-any.whl
# 检查元数据
twine check dist/*
# 查看包内容
unzip -l dist/*.whl | head -10
- 注册 PyPI 账号
- 在账号设置中创建 API Token
- 作用域选择 “Entire account (all projects)”
# 上传到正式 PyPI
twine upload dist/*
# 使用 API Token 认证
# 用户名: __token__
# 密码: pypi-xxxxxxxxxxxxxxxxxxxx
# 验证发布成功
pip install your-package-name
推荐先在 TestPyPI 测试:
# 注册 TestPyPI 账号 # 访问 https://test.pypi.org # 上传到测试环境 twine upload --repository-url https://test.pypi.org/legacy/ dist/* # 从测试环境安装 pip install --index-url https://test.pypi.org/simple/ your-package-name
ERROR: InvalidDistribution: Metadata is missing required fields: Name, Version
解决方案:
# 升级 twine 到最新版本 pip install --upgrade twine # 使用模块方式运行 python -m twine check dist/*
HTTPError: 400 Client Error: The name 'your-package' is already in use
解决方案:
- 在
pyproject.toml中修改name字段 - 确保包名在 PyPI 上唯一
HTTPError: 400 Client Error: File already exists
解决方案:
- 在
pyproject.toml中更新version字段 - 删除已上传的错误版本(通过 PyPI 管理界面)
- 更新
pyproject.toml 中的版本号
- 确保 README.md 内容完整且格式正确
- 验证所有依赖项已正确声明
- 测试本地安装:
pip install dist/your-package-*.whl
- 检查包名在 PyPI 上的可用性
- 准备好 PyPI API Token
pyproject.toml 中的版本号pip install dist/your-package-*.whl
-
语义化版本控制:
主版本.次版本.修订版本
- 不兼容的 API 修改:主版本号递增
- 向下兼容的功能性新增:次版本号递增
- 向下兼容的问题修正:修订版本号递增
-
发布流程:
# 1. 更新版本号
# 编辑 pyproject.toml: version = "0.1.1"
# 2. 提交更改
git add pyproject.toml
git commit -m "Bump version to 0.1.1"
git tag v0.1.1
# 3. 构建和发布
rm -rf dist/ build/ *.egg-info/
python -m build
twine upload dist/*
语义化版本控制:
主版本.次版本.修订版本- 不兼容的 API 修改:主版本号递增
- 向下兼容的功能性新增:次版本号递增
- 向下兼容的问题修正:修订版本号递增
发布流程:
# 1. 更新版本号 # 编辑 pyproject.toml: version = "0.1.1" # 2. 提交更改 git add pyproject.toml git commit -m "Bump version to 0.1.1" git tag v0.1.1 # 3. 构建和发布 rm -rf dist/ build/ *.egg-info/ python -m build twine upload dist/*
[tool.setuptools]
include-package-data = true
[tool.setuptools.package-data]
"your_package.data" = ["*.json", "*.txt"]
[project.optional-dependencies]
dev = ["pytest>=6.0", "black"]
gui = ["tkinter", "pyqt5"]
[project.scripts]
my-cli = "my_package:main"
[project.gui-scripts]
my-gui = "my_package.gui:main"
通过本指南,你可以:
- 正确配置
pyproject.toml文件 - 使用现代工具链构建 Python 包
- 安全地将包发布到 PyPI
- 解决常见的发布问题
发布后,用户可以通过 pip install your-package-name 安装你的包,让你的代码为社区所用!
本文基于实际项目经验整理,适用于 Python 3.7+ 和现代打包工具链。到此这篇关于Python包发布到PyPI的实现步骤的文章就介绍到这了,更多相关Python包发布到PyPI内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- 如何将Python包发布到PyPI的完整指南
- python打包发布pypi及更新全部流程
- 将自己的Python包发布到PyPI上的教程详解
- Python实现在PyPI上发布自定义软件包的方法详解
- 用Python将库打包发布到pypi
- Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
- 将python包发布到PyPI和制作whl文件方式