创建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 pythonpip 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官网建议的命令安装:
但提示找不到geos或geos-devel包。sudo yum install -y amazon-linux-extras sudo amazon-linux-extras enable epel sudo yum search geos sudo yum install 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
相关产品推荐
相关产品推荐

