能传上去,但大概率第一次会失败——不是代码问题,而是 setup.pypyproject.toml 里少写了关键元数据,或者认证方式没走对 twine 流程。

setup.py 和 pyproject.toml 到底该用哪个?

Python 官方现在的态度很明确:优先用 pyproject.tomlsetup.py 属于“能用但别再新写了”的状态。新项目直接上 pyproject.toml,省得以后还得迁移。

几个关键点:

pyproject.toml 必须填哪些字段才能过 PyPI 校验?

PyPI 在上传时对元数据的校验相当严格,缺一个字段就给你打回来。descriptionreadme 是最容易被漏掉的,哪怕内容只写一行也能过关,但绝不能空着。

具体看看哪些是必填项:

twine upload 总是 403 或 “invalid or non-existent authentication information”

这不是密码输错了,而是你没用 PyPI 的 API token,还试图用账号密码登录——从 2023 年开始,PyPI 已经禁止密码直接上传了。

正确的做法是:

上传前必须跑的三步本地检查

跳过这三步,90% 的上传失败都发生在这里,而且错误信息藏得特别深。

第一步:python -m build,生成 dist/ 目录下的 .whl.tar.gz 文件。如果这一步失败,说明 pyproject.toml 的语法或者依赖声明有问题。

第二步:twine check dist/*,验证包描述能否正确解析、README 格式是否合法。如果报 InvalidDistribution,多半是 readme 路径写错了,或者没指定 content-type

第三步:pip install --find-links dist/ --no-index your-package-name,在一个干净的虚拟环境中安装一遍。这一步非常关键——很多包上传后能装成功,但 import 的时候报 ModuleNotFoundError,原因就是 packages 字段没有自动发现子模块。

最麻烦的其实是包结构本身的问题。比如你的模块放在 src/mylib/ 目录下,但 pyproject.toml 里没配 packages = [{include = "mylib", from = "src"}],那么生成的 wheel 文件里就根本没有代码。这种问题 twine check 是检查不出来的,只有最后那步本地安装验证才能抓到。

本文转载于:https://www.php.cn/faq/2342114.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。