如何将具有已编译二进制文件的 Python 程序包添加到我的部署程序包并使其与 Lambda 兼容?

上次更新日期:2022 年 9 月 23 日

我使用 pip 安装包含已编译代码的 Python 程序包,现在我的 AWS Lambda 函数返回“无法导入模块”错误。为什么会出现这种情况,我该怎样解决这个问题呢?

简短描述

默认情况下,包含已编译代码(例如:NumPy 和 Pandas)的 Python 程序包并不总是与 Lambda 运行时兼容。如果使用 pip 安装这些程序包,它们将针对您的本地机器架构下载并编译一个模块名称程序包。如果您未使用 Linux 操作系统,这将使您的部署程序包与 Lambda 不兼容。

要在 Linux 操作系统之外使用 pip 时创建与 Lambda Python 运行时兼容的 Lambda 部署包或层,请使用 manylinux2014 作为 — platform 参数的值运行 pip 安装命令

注意:macOS --platform 标签不起作用。例如:win_amd64macosx_10_6_intel 标签不会安装与 Lambda 兼容的部署程序包。

解决方法

注意:此示例过程展示如何为在 x86_64 架构上运行的 Lambda Python 3.9 运行时安装 Pandas。

1.    打开命令提示符。然后,通过运行以下 pip 命令确认使用的是 19.3.0 或更高版本的 pip:

pip --version

如果使用的是早于 19.3.0 版本的 pip,请运行以下命令升级到最新版本的 pip:

python3.9 -m pip install --upgrade pip

2.    通过运行以下命令,将预编译 Python 程序包的 .whl 文件作为依赖项安装到 Lambda 函数的项目目录中:

重要提示:my-lambda-function 替换为函数的项目目录名称。

pip install \
    --platform manylinux2014_x86_64 \
    --target=my-lambda-function \
    --implementation cp \
    --python 3.9 \
    --only-binary=:all: --upgrade \
    pandas

3.    打开 Lambda 函数的项目目录。如果使用 macOS,则运行以下命令:

cd my-lambda-function

4.    在文本编辑器中,创建名为 lambda_function.py 的新文件。然后,将以下示例代码复制并粘贴到该文件中,并将其保存在 Lambda 函数的项目目录中:

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)

5.    通过运行以下命令创建包含所有已安装库和源代码的 Lambda 部署程序包 .zip 文件存档:

zip -r ../my-deployment-package.zip .

6.    使用 my-deployment-package.zip 文件存档新建 Python 3.9 Lambda 函数或更新现有函数。有关说明,请参阅 AWS 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 3.9 \
    --only-binary=:all: --upgrade \
    pandas

这篇文章对您有帮助吗?


您是否需要账单或技术支持?