无法将Python模块发布至PyPI,请求技术排查
这个问题我之前帮不少开发者排查过,根源很明确:你的setup.py里的download_url参数配置错了,导致PyPI拒绝了你的上传请求。
为什么会报错?
错误提示里清楚写着'Easy-email-0.0.1.tar.gz' is an invalid value for Download-URL,而且附带的链接是https://test.pypi.org/legacy/——这说明你把PyPI的上传接口地址当成了项目的下载链接填进了download_url里,这完全不符合PyPI的元数据规范,PyPI自然会判定这个URL无效。
具体解决步骤
1. 修正setup.py的download_url字段
download_url的作用是指定你的项目源码的外部下载地址(比如GitHub的release压缩包、GitLab的tag归档),绝对不能填PyPI的地址。举个正确的配置示例:
from setuptools import setup setup( name="easy-email", version="0.0.1", # 正确的配置:指向GitHub仓库的v0.0.1版本归档 download_url="https://github.com/your-username/easy-email/archive/refs/tags/v0.0.1.tar.gz", author="Your Name", description="A simple email utility package", # 其他必要参数... )
如果你不需要自定义外部下载链接,直接删掉download_url这一行也完全没问题——PyPI会自动为你的包生成下载地址,不影响任何功能。
2. 清理旧构建产物并重新打包
之前生成的dist/easy-email-0.0.1.tar.gz已经包含了错误的元数据,必须清理后重新构建:
# 删除旧的构建文件夹和缓存 rm -rf dist build *.egg-info # 推荐用官方推荐的build工具构建(先确保安装了build) python -m pip install --upgrade build python -m build # 或者用传统的setup.py方式构建 # python setup.py sdist bdist_wheel
3. 重新上传到PyPI
用twine上传新生成的包文件即可:
twine upload dist/*
额外小提示
- 包名尽量用全小写字母,虽然PyPI允许大小写混合,但小写更符合Python社区的惯例,也能避免一些潜在的命名冲突。
- 如果你是上传到Test PyPI测试,记得确保twine配置的是Test PyPI的仓库地址,避免误传到正式环境。
内容的提问来源于stack exchange,提问作者Benjamin Sommer




