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

创建Python3.9的Shapely 2.0 AWS Lambda层遇模块缺失错误,求解决方案

问题描述

我正尝试为Python3.9运行时的AWS Lambda创建可使用Shapely的层,但Lambda持续返回错误:
lambda_function': No module named 'shapely.lib
推测是.zip文件存在问题,我的安装路径为shapely.zip/python/..。

已执行的操作:

  • 在Python3虚拟环境中打包shapely、geos、pyproj和numpy,执行命令如下:
    mkdir python
    python3 -m venv env
    source env/bin/activate
    cd python
    pip3 install shapely -t python
    pip3 install geos -t python
    pip3 install numpy -t python
    pip3 install pyproj -t python
    zip -r shapely.zip python
    
    也试过pip install shapely,但返回Nothing to do;
  • 尝试在Amazon Linux 2的EC2上安装Python3.9并创建虚拟环境,但EC2提示python3.9是未知命令;
  • 发现pip3 install geos可能安装了错误版本,于是尝试手动编译安装GEOS 3.9.0,执行命令:
    wget http://download.osgeo.org/geos/geos-3.9.0.tar.bz2
    tar xvfj geos-3.9.0.tar.bz2
    cd geos-3.9.0
    ./configure
    make
    sudo make install
    
    但出现错误:
    /bin/mkdir -p '/usr/local/lib'
     '/bin/sh ../libtool   --mode=install /bin/install -c   libgeos.la '/usr/local/lib'`    
    libtool: install: 'libgeos.la' is not a valid libtool archive'  
    libtool: install: Try 'libtool --help --mode=install' for more information.`  
    make[4]: *** [install-libLTLIBRARIES] Error 1`  
    make[4]: Leaving directory '/usr/python/python/geos-3.9.0/src'`  
    make[3]: *** [install-am] Error 2`  
    make[3]: Leaving directory '/usr/python/python/geos-3.9.0/src'`  
    make[2]: *** [install-recursive] Error 1`  
    make[2]: Leaving directory '/usr/python/python/geos-3.9.0/src'`  
    make[1]: *** [install-recursive] Error 1`  
    make[1]: Leaving directory '/usr/python/python/geos-3.9.0'`  
    make: *** [install] Error 2`  
    
  • 尝试通过libgeos官网建议的命令安装:
    sudo yum install -y amazon-linux-extras
    sudo amazon-linux-extras enable epel
    sudo yum search geos
    sudo yum install geos geos-devel
    
    但提示找不到geos或geos-devel包。

请问有人成功创建过该层吗?或有可行的解决建议吗?


解决建议

核心逻辑:Lambda层依赖必须匹配Amazon Linux 2运行时环境

本地打包的依赖常包含与Lambda环境不兼容的二进制文件,这是导致shapely.lib找不到的主要原因。以下是可落地的解决方案:

1. 在Amazon Linux 2 EC2上安装Python3.9

EC2默认无Python3.9,需手动编译安装:

# 安装编译依赖
sudo yum install -y gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget

# 下载Python3.9源码包
wget https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tgz
tar xzf Python-3.9.18.tgz
cd Python-3.9.18

# 编译安装(指定prefix避免覆盖系统默认Python)
./configure --enable-optimizations --prefix=/usr/local/python3.9
make altinstall

# 创建软链接简化调用
sudo ln -s /usr/local/python3.9/bin/python3.9 /usr/bin/python3.9
sudo ln -s /usr/local/python3.9/bin/pip3.9 /usr/bin/pip3.9

验证安装:执行python3.9 --version和pip3.9 --version确认版本正确。

2. 在EC2中打包兼容的Lambda层

无需单独安装GEOS,Shapely会自动处理其依赖,只需确保系统有编译依赖:

# 创建并激活Python3.9虚拟环境
python3.9 -m venv lambda-env
source lambda-env/bin/activate

# 安装Shapely编译所需的系统依赖
sudo yum install -y geos-devel

# 创建Lambda层要求的目录结构,安装依赖
mkdir -p python/lib/python3.9/site-packages
pip install shapely numpy pyproj --target python/lib/python3.9/site-packages

# 打包成符合Lambda要求的zip文件
zip -r shapely-layer.zip python/

该zip的结构应为shapely-layer.zip/python/lib/python3.9/site-packages/shapely/...,Lambda会自动识别此路径。

3. 快速替代方案:使用预构建层

若不想手动编译,可选用社区维护的Python3.9版本Shapely预构建Lambda层,注意选择与Lambda运行时匹配的版本,上传后关联至目标Lambda函数即可。

4. 本地打包的修正方案

如果坚持本地打包,需做以下调整:

  • 安装manylinux兼容的Shapely包:pip install shapely --only-binary :all: --platform manylinux2014_x86_64
  • 修正路径嵌套问题:你的原有命令中cd python后执行pip install -t python会导致路径变为python/python/shapely,应在python目录外执行pip install -t python/ shapely numpy pyproj,确保zip结构为python/shapely。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:02:46