必须确认setup.py或pyproject.toml、readme.md、__version__定义三文件齐全;pyproject.toml为当前推荐,需含[build-system]和[project]段;readme.md须utf-8编码;__version__须代码内明确定义且与配置严格一致。

打包前必须确认的三个文件
没有 setup.py 或 pyproject.toml,根本没法生成有效包。PyPI 不接受裸 Python 文件或压缩包。你得先有标准元数据描述——这是门槛,不是可选项。
-
pyproject.toml是当前推荐方式(PEP 517/518),内容至少包含[build-system]和[project]段;setup.py已逐步被弃用,但仍有项目在用 -
README.md必须存在且编码为 UTF-8,PyPI 会直接渲染它作为包主页,缺失会导致上传失败或页面空白 -
__version__必须在代码中明确定义(比如mylib/__init__.py里写__version__ = "0.1.0"),且要和pyproject.toml中的version字段严格一致,否则用户安装后import mylib; mylib.__version__可能报错或不匹配
构建命令别用错:build vs sdist bdist_wheel
pip install build 后执行 python -m build,它默认同时生成 .tar.gz(源码分发)和 .whl(二进制分发)。但很多人误以为只跑 python setup.py sdist 就够了——这只会产出源码包,没 wheel,Windows/macOS 用户 pip install 时可能因缺少编译环境而失败。
- wheel 包能跳过本地编译,安装更快更稳定,PyPI 强烈建议上传 wheel
- 如果项目含 C 扩展(如用 Cython),必须确保
bdist_wheel能成功运行,否则 wheel 包缺失或损坏 - 构建产物在
dist/目录下,上传前务必检查文件名是否含正确版本号,例如mylib-0.1.0-py3-none-any.whl—— 若出现mylib-0.1.0.dev0这类开发版标识,PyPI 会拒绝上传
上传时认证失败的常见原因
用 twine upload dist/* 上传,但报 403 Client Error 或 Invalid API token,大概率不是密码错了,而是 token 权限或作用域不对。
- 必须用 PyPI 的 API token(Settings → API tokens → Create legacy token 或 scoped token),不能用账号密码(已禁用)
- scoped token 需显式勾选目标项目名;legacy token 默认对所有包生效,但安全性低,不推荐
- token 建议存于
~/.pypirc,格式必须严格:[pypi] username = __token__ password = pypi-AgEI...(完整 token 字符串)
注意username固定为__token__,不是你的用户名
发布后用户 still gets old version?
上传成功不代表用户立刻拿到最新版。pip 缓存、镜像源延迟、版本号格式不合规都会导致这个问题。
- 版本号必须符合 PEP 440,比如
0.1.0、1.2.3a1、2.0.0.post1。用0.1或v1.0会被 pip 视为无效版本,降级回上一个合规版本 - 国内用户常走清华、豆瓣等镜像源,它们同步 PyPI 有 5–30 分钟延迟,可临时加
-i https://pypi.org/simple/强制直连验证 - 如果重传同版本号(比如删掉 dist/ 再 build 再 upload),PyPI 会拒绝——每个版本只能上传一次,改错只能升版本号
真正麻烦的是跨平台 wheel 兼容性声明写错,或者 requires-python 设太窄(比如写成 >=3.9,),结果用户用 Python 3.11 安装时 pip 直接跳过你的包——这种问题不会在上传时报错,但会让下游完全不可见。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











