执行python setup.py sdist生成两个tar.gz,上传TestPyPI报错仅允许传一个sdist
为什么
python setup.py sdist生成两个tar.gz文件,以及如何解决上传报错的问题 首先,咱们来拆解你的问题:
一、生成两个tar.gz文件的可能原因
最常见的情况是你的dist目录里残留了之前生成的旧包文件。如果你没有在每次运行sdist前清理dist目录,多次执行sdist(哪怕版本号没变)会导致目录里积累多个同版本的包——不过通常sdist会提示文件已存在,除非你加了--force参数强制覆盖生成。
另一种可能是项目配置或结构的问题:看你的setup.py,你用了find_packages(exclude=['tests'])来自动发现包,同时指定了scripts=['git-maildiff']脚本,但这两个配置是可以共存的,不会生成两个独立的sdist包。所以大概率是旧文件残留的问题。
二、解决TestPyPI上传报错的方法
报错提示“Only one sdist may be uploaded per release”,意思是同一个版本号只能上传一个源码包。解决步骤很简单:
彻底清理旧的构建文件:
rm -rf dist/ build/ *.egg-info/这会删掉所有之前生成的包、构建缓存和egg信息,确保没有残留。
重新生成单个sdist包:
python setup.py sdist现在你去
dist目录看,应该只有一个git-maildiff-0.1.0.tar.gz文件(对应你setup.py里的版本号)。用twine上传单个包:
你可以直接指定文件名上传,避免匹配多个文件:twine upload -r pypitest dist/git-maildiff-0.1.0.tar.gz或者如果担心后续有多个文件,也可以用
--skip-existing参数跳过已上传的包,但清理后只传单个文件是最稳妥的。
额外小建议
- 后续发布时,建议先清理构建目录再生成包,避免旧文件干扰;
- 尽量避免直接修改版本号后重复生成包,每次发布用唯一的版本号;
- 可以考虑使用
setuptools_scm这类工具自动管理版本号,减少手动修改的错误。
内容的提问来源于stack exchange,提问作者Ciasto piekarz
相关产品推荐
相关产品推荐

