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

Amazon Linux EC2中无法从S3 PyPI源安装非whl包statsmodels

解决Amazon Linux上S3 PyPI源安装非Wheel包的依赖问题

背景

我们团队出于合规和内网管控需求,决定把所有Python私有、公开依赖(包括它们的嵌套依赖)全托管到Amazon S3上,全程只从S3下载安装包。我自己整理了一套S3搭建PyPI源的步骤:

  • 用pip download numpy==1.14.2、pip download statsmodels==0.6.1这类命令先把公开包下载到本地
  • 安装时指定S3源,命令是:
    pip install pandas --index-url=http://<s3_endpoint> --trusted-host=<s3_endpoint> --no-cache-dir
    

第一个坑:非Wheel包的依赖会偷偷跑向PyPI

Wheel格式的包(比如pandas)安装起来毫无问题,依赖处理也正常,但碰到statsmodels-0.6.1.tar.gz这种源码包就出状况了:安装statsmodels的时候,它的依赖安装流程会调用easy_install,但pip的--index-url参数根本不被easy_install识别,结果就是easy_install直接默认去pypi.org拉numpy,完全绕开了我们的S3源。

初步修复:给源码包加setup.cfg配置

我当时的解决办法是解压statsmodels-0.6.1.tar.gz,编辑里面的setup.cfg,加一段[easy_install]的配置,把它的依赖源强制指向S3:

[easy_install]
index_url = http://<s3_endpoint>
find_links = http://<s3_endpoint>

重新打包上传到S3后,本地Ubuntu和Ubuntu EC2上测试都正常——statsmodels乖乖从S3拉numpy完成安装。

新问题:Amazon Linux AMI 2017.03上直接报错

本以为万事大吉,结果在Amazon Linux AMI 2017.03(系统信息:NAME="Amazon Linux AMI" VERSION="2017.03" ID="amzn" ID_LIKE="rhel fedora" VERSION_ID="2017.03" PRETTY_NAME="Amazon Linux AMI 2017.03")上安装时直接失败。看pip日志发现,执行python setup.py egg_info的时候抛出了错误:

No local packages or download links found for numpy

DistutilsError: Could not find suitable distribution for Requirement.parse('numpy')

针对Amazon Linux的修复方案

排查了半天,才发现问题出在Amazon Linux自带的setuptools版本上——2017.03版本自带的setuptools是0.9.x的老旧版本,远低于Ubuntu里的版本,旧版对setup.cfg里[easy_install]段的参数支持有bug,根本识别不了我们加的index_url。

给大家整理几个亲测有效的解决办法:

方法1:先升级setuptools再安装

最省心的就是先从S3源把setuptools升到新版本,比如30.0.0以上:

pip install --index-url=http://<s3_endpoint> --trusted-host=<s3_endpoint> --no-cache-dir setuptools>=30.0.0

升级完再装statsmodels,新版setuptools能正确识别setup.cfg里的配置,乖乖从S3拉依赖。

方法2:直接改setup.py而非setup.cfg

旧版setuptools对setup.py里的参数支持更靠谱,我们可以直接修改statsmodels的setup.py,在setup()函数里指定依赖源:

from setuptools import setup

setup(
    # 保留原有的其他配置...
    dependency_links = ["http://<s3_endpoint>"],
    setup_requires = ["numpy"],
    # 嫌麻烦的话,甚至可以直接指定numpy的S3下载链接
    install_requires = ["numpy @ http://<s3_endpoint>/numpy-1.14.2.tar.gz"]
)

重新打包上传后,旧版setuptools会通过dependency_links找到S3上的依赖包。

方法3:预安装所有依赖兜底

如果上面两种方法都搞不定,那就先单独从S3源把statsmodels的所有依赖(比如numpy)装了,再装statsmodels:

pip install --index-url=http://<s3_endpoint> --trusted-host=<s3_endpoint> --no-cache-dir numpy==1.14.2
pip install --index-url=http://<s3_endpoint> --trusted-host=<s3_endpoint> --no-cache-dir statsmodels==0.6.1

总结

本质上就是Amazon Linux 2017.03自带的setuptools太老导致的兼容性问题,优先推荐升级setuptools的方案,既能解决当前问题,还能避免以后其他包再出类似的依赖拉取异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:57:25