pip安装自定义PyPI包失败:依赖项无法找到问题
解决Python 2.7环境下TestPyPI包依赖安装失败的问题
这种情况我维护老版本Python兼容包时也碰到过,结合你的场景,大概率是以下几个常见原因导致的,咱们一步步排查解决:
1. 依赖包在TestPyPI上缺少Python 2.7兼容版本
TestPyPI是独立于官方PyPI的仓库,很多主流包的老版本(尤其是支持Python2.7的版本)可能没有同步到这里。如果你的install_requires里指定的依赖,在TestPyPI上找不到对应py27的wheel或源码包,pip自然会安装失败。
- 解决方法:
- 先逐个验证依赖是否能在py27环境下从TestPyPI安装:执行
pip install [依赖包名]==[指定版本] --index-url https://test.pypi.org/simple/,比如pip install requests==2.25.1 --index-url https://test.pypi.org/simple/ - 如果某个依赖在TestPyPI上没有,你可以把该依赖的兼容py27的版本上传到TestPyPI,或者调整
install_requires的版本约束,指定那些在TestPyPI上存在的、支持py27的版本号。
- 先逐个验证依赖是否能在py27环境下从TestPyPI安装:执行
2. Python 2.7环境的pip版本过旧
Python2.7的pip版本必须低于21.0(因为pip21.0及以后彻底放弃了对py27的支持)。纯净py27环境自带的pip可能是非常老的版本,无法正确解析现代的依赖声明,甚至连TestPyPI的索引格式都不支持。
- 解决方法:
先升级pip到py27兼容的最新版本,再安装你的包:pip install --upgrade "pip<21" --index-url https://test.pypi.org/simple/ pip install your-package-name --index-url https://test.pypi.org/simple/
3. setup.py中的依赖声明存在问题
可能是依赖包名写错,或者版本约束不兼容py27:
有些包在py27和py3下的包名不同,比如
configparser在py2中对应的包是ConfigParser,enum34是py2中替代py3原生enum的依赖;版本约束太宽松,导致pip拉取了不支持py27的新版本(比如
requests>=2.26.0就不再支持py27,需要改成requests>=2.25.1,<2.26.0)。解决方法:
仔细核对install_requires里的每个依赖:- 确保包名是py27环境下正确的名称;
- 给每个依赖加上明确的、兼容py27的版本范围,比如:
install_requires=[ 'requests>=2.20.0,<2.26.0', 'ConfigParser>=3.5.0', 'enum34>=1.1.10' ]
4. TestPyPI索引配置不完整
如果你的依赖一部分在TestPyPI,一部分在官方PyPI,只指定--index-url会导致pip无法从官方PyPI拉取公共依赖。
- 解决方法:
使用--extra-index-url补充官方PyPI索引,这样pip会优先从TestPyPI找包,找不到的再去官方PyPI拉取:pip install your-package-name --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/
先按照上面的步骤逐个排查,尤其是先手动安装单个依赖,定位到具体是哪个依赖出问题,再针对性解决会更高效。
内容的提问来源于stack exchange,提问作者Val




