我使用 pip 安装了一个包含已编译代码的 Python 包,现在我的 AWS Lambda 函数返回“无法导入模块”错误。
简短描述
默认情况下,包含已编译代码(例如 NumPy 和 pandas)的 Python 包并不总是与 Lambda 运行时系统兼容。如果您使用 pip 安装这些包,则这些包会下载并编译适用于本地机器架构的模块名称包。如果您未使用 Linux 操作系统(OS),这会使您的部署包与 Lambda Python 运行时系统不兼容。
要使您的部署包或层与非 Linux 操作系统上的 Lambda 兼容,请运行 pip install 命令,其中将 manylinux2014 用作 --platform 参数的值。
**注意:**macOS --platform 标签不起作用。例如,win_amd64 和 macosx_10_6_intel 标签不安装与 Lambda 兼容的部署包。
解决方法
**注意:**以下示例过程显示了如何为在 x86_64 架构上运行的 Lambda Python 3.9 运行时系统安装 pandas。
-
打开命令提示符。然后,运行以下 pip 命令以确认您使用的 pip 版本为 19.3.0 或更高版本:
pip --version
如果您使用的 pip 版本比 pip 版本 19.3.0 旧,则升级到最新版本的 pip:
python3.9 -m pip install --upgrade pip
-
将预编译的 Python 包的 .whl 文件作为依赖项安装在 Lambda 函数的项目目录中:
**重要事项:**将 my-lambda-function 替换为您函数的项目目录的名称。
pip install \
--platform manylinux2014_x86_64 \
--target=my-lambda-function \
--implementation cp \
--python-version 3.9 \
--only-binary=:all: --upgrade \
pandas
-
打开您的 Lambda 函数的项目目录。如果您使用 macOS,则运行以下命令:
cd my-lambda-function
-
在文本编辑器中,创建名为 lambda_function.py 的新文件。然后,将以下示例代码复制并粘贴到文件中:
import numpy as np
import pandas as pd
def lambda_handler(event, context):
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=["a", "b", "c"])
number = np.pi
print(df2)
print(number)
将此文件保存在您的 Lambda 函数的项目目录中。
-
创建 Lambda 部署包 .zip 文件存档,其中包含所有已安装的库和源代码:
zip -r ../my-deployment-package.zip .
使用 my-deployment-package.zip 文件存档创建新的 Python 3.9 Lambda 函数或更新现有函数。有关说明,请参阅处理 Python Lambda 函数的 .zip 文件存档。
**注意:**您可以使用类似的过程来创建可用于多个函数的 Lambda 层。例如,以下命令创建了一个新的 Lambda 层,用于为在 arm64 架构上运行的 Lambda Python 3.9 运行时系统安装 pandas:
pip install \
--platform manylinux2014_aarch64 \
--target=./python/lib/python3.9/site-packages \
--implementation cp \
--python-version 3.9 \
--only-binary=:all: --upgrade \
pandas
相关信息
创建和共享 Lambda 层