You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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”,意思是同一个版本号只能上传一个源码包。解决步骤很简单:

  1. 彻底清理旧的构建文件:

    rm -rf dist/ build/ *.egg-info/
    

    这会删掉所有之前生成的包、构建缓存和egg信息,确保没有残留。

  2. 重新生成单个sdist包:

    python setup.py sdist
    

    现在你去dist目录看,应该只有一个git-maildiff-0.1.0.tar.gz文件(对应你setup.py里的版本号)。

  3. 用twine上传单个包:
    你可以直接指定文件名上传,避免匹配多个文件:

    twine upload -r pypitest dist/git-maildiff-0.1.0.tar.gz
    

    或者如果担心后续有多个文件,也可以用--skip-existing参数跳过已上传的包,但清理后只传单个文件是最稳妥的。

额外小建议

  • 后续发布时,建议先清理构建目录再生成包,避免旧文件干扰;
  • 尽量避免直接修改版本号后重复生成包,每次发布用唯一的版本号;
  • 可以考虑使用setuptools_scm这类工具自动管理版本号,减少手动修改的错误。

内容的提问来源于stack exchange,提问作者Ciasto piekarz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:51:03