You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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的版本号。

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中对应的包是ConfigParserenum34是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

火山引擎 最新活动