发布至TestPyPI的Python包安装时无法拉取已声明依赖的问题
问题产生原因
- pip的索引替换机制:执行带
-i https://test.pypi.org/simple/参数的安装命令时,pip会完全替换默认的正式PyPI检索源,所有包(包括目标自定义包、该包关联的全部第三方依赖)的版本校验、文件下载,都会仅通过指定的TestPyPI地址完成,不会自动回退到正式PyPI拉取资源。 - TestPyPI的资源特性:TestPyPI是PyPI的独立测试实例,不会自动同步正式PyPI上的全量公开第三方包。日志中成功拉取到feedparser,只是巧合TestPyPI上存在测试人员上传的对应版本分发;当检索到html2text、importlib_resources等常规依赖时,TestPyPI上无匹配的分发文件,就会抛出“找不到匹配版本”的报错。
- 排除配置误区:该报错和
setup.py中install_requires的声明写法无关,pip已经正确读取到了你声明的全部依赖规则,只是当前指定的索引源缺少对应依赖的可下载资源。
修复方案
- 调整pip的源配置逻辑,让TestPyPI仅作为自定义测试包的来源,同时保留正式PyPI作为公开第三方依赖的检索源,两种实现方式二选一即可:
- 用
--extra-index-url参数将TestPyPI附加到默认源,不替换正式PyPI的索引优先级,对应安装命令为:
该配置下pip会优先从正式PyPI拉取所有公开依赖,仅当检索目标为你上传的测试包时,从附加的TestPyPI源拉取对应文件。pip install thrayld-reader-test --extra-index-url https://test.pypi.org/simple/ - 如果确实需要将TestPyPI设为主索引,需显式追加正式PyPI地址作为兜底索引,避免公开依赖检索失败,对应安装命令为:
pip install -i https://test.pypi.org/simple/ thrayld-reader-test --extra-index-url https://pypi.org/simple/
- 用
- 避坑提示:不要通过手动上传公开依赖到TestPyPI的方式解决问题,这种操作维护成本高,极易出现版本错配、安全校验失效等风险。
内容的提问来源于stack exchange,提问作者Tomáš Hons
相关产品推荐
相关产品推荐

