【问题标题】:AWS Lambda: cannot import name '_imaging' from 'PIL'AWS Lambda:无法从“PIL”导入名称“_imaging”
【发布时间】:2019-12-03 10:55:51
【问题描述】:

我目前正在尝试运行此 AWS Lambda 入门教程:https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-python

但是,我总是收到错误消息:

{
  "errorMessage": "Unable to import module 'CreateThumbnail': cannot import name '_imaging' from 'PIL' (/var/task/PIL/__init__.py)",
  "errorType": "Runtime.ImportModuleError"
}

日志输出

START RequestId: fefba1d1-443c-4617-a5ad-c3aac19e5591 Version: $LATEST
[ERROR] Runtime.ImportModuleError: Unable to import module 'CreateThumbnail': cannot import name '_imaging' from 'PIL' (/var/task/PIL/__init__.py)
END RequestId: fefba1d1-443c-4617-a5ad-c3aac19e5591
REPORT RequestId: fefba1d1-443c-4617-a5ad-c3aac19e5591  Duration: 1.52 ms   Billed Duration: 100 ms     Memory Size: 1024 MB    Max Memory Used: 71 MB  

我从lambci/docker-lambda 图像构建了我的.zip。但这并没有解决我的问题。

这是我的 .zip 文件中的内容。您有什么想法,为什么我仍然会收到此错误?

【问题讨论】:

  • 你运气好吗?我面临同样的错误
  • @hax 请看下面我的回答。

标签: python amazon-web-services aws-lambda


【解决方案1】:

为了回答@hax 评论,我在这里得到了这个解决方案: https://github.com/marcmetz/Create-AWS-Lambda-Function-with-Docker

我遇到的问题是我的 Mac 上的 Python 安装与 AWS 上的安装不同。为了使用我的解决方案,请在存储库中安装 Docker、cd,并将您的包添加到 requirements.txt。然后只需运行以下命令:

docker build -t fbprophet . && \
docker run --rm -v $PWD:/export \
fbprophet cp upload-to-s3.zip /export

这将 (1) 创建一个基于 this 的 Docker 容器,(2) 安装在 requirements.txt 中定义的所有包和依赖项,然后 (3) 在存储库文件夹中返回一个 .zip 文件。该 .zip 文件可用于您的 Lambda 函数。

确保还将lambda_function.py 调整为您想要的任何功能。

【讨论】:

  • 在第二个学习周期中,了解 AWS 函数的层。类似的方法,只是你可以在编辑器中编写你的 lambda 函数,这样更方便。但一开始,上面的解决方案应该可行。
【解决方案2】:

这是因为 PIL 包含您的 pip 安装的已编译二进制文件 (cython),而 lambda 不知道如何处理它。

您可以使用以下方法简单地创建一个 zip 文件,而不是使用 docker 创建一个 lambda 函数并添加所有不必要的开销:

  1. 从 pypi.org 下载 "module-name"-"version"-cp"python-version"-cp"python-versionm-manylinux1_x86_64.whl 文件。注意:在你的情况下,它应该是Pillow-7.1.2-cp37-cp37m-manylinux1_x86_64.whl
  2. 通过运行 unzip Pillow-7.1.2-cp37-cp37m-manylinux1_x86_64.whl 解压缩您的 whl 文件
  3. 将所有文件与 lambda_function.py 一起添加到新的 zip 文件中
  4. 将新的 zip 文件上传到 lambda,一切顺利。

此解决方案适用于任何包含已编译二进制文件 (cython) 的包,例如 numpy。

参考: https://aws.amazon.com/premiumsupport/knowledge-center/lambda-python-package-compatible

【讨论】:

    【解决方案3】:

    尽管尝试了所有这些步骤,但我仍然面临错误。最后我找到了我的问题:)

    对我来说,AWS Lamda 运行时中的 Python 版本是 python 3.7.7。我使用 python 3.6 安装了 Pillow。 PIL 与不同版本的 python 的兼容性似乎存在一些问题。

    所以要解决这个问题,要么将 AWS lambda 运行时更改为 python3.6。(这是我尝试过的并且确实有效)

    或者,也可以尝试为 python 3.7.7 安装枕头并将其复制到 lambda。

    由于 cython 存在问题,最好的方法是使用 amazon linux 或使用 AWS AMI docker 映像在 EC2 中安装软件包。

    【讨论】:

    • 谢谢!这似乎是我的环境的问题!
    【解决方案4】:

    像 Pillow 这样的一些库已被弃用,它们被分叉以供社区继续升级。问题是在 aws 中运行 python 的操作系统基础,因为它们不使用分叉库。为此,aws 为 lambdas 创建层(不仅为此,但我现在不会解释),您可以在特定操作系统和特定版本的编程语言(在本例中为 python)上使用您自己的资源创建一个层并放置层进入你的 lambda,这样你就可以运行 Pillow 或其他有同样问题的库。

    要创建层,您需要了解 docker 和 linux 脚本...

    但是如果已经存在,我们为什么还要用糖来制造水呢?

    在此存储库中:https://github.com/keithrozario/Klayers 你有很多层可以使用。

    我给你举个例子,当你遇到 Pillow 问题时如何添加一层。

    在这个 lambda 中,我需要使用 PIL,因为我使用 aws 识别文本并且我管理 Image 对象来绘制正方形和其他东西。如果你看到我有同样的错误:

    (我不能发布图片:(所以这里是链接) https://i.imgur.com/ifhv4pJ.jpg

    接下来我们需要做的是擦除库,因为我们在 lambda 的基本代码中不需要它,原因我在本文开头已经解释过。

    您的 lambda 现在需要看起来像这样:

    https://i.imgur.com/Y8hvqa0.jpg

    现在,根据您的 python 版本或您在 aws 中的区域,您将在存储库中搜索您需要使用的层的特定 arn [https://github.com/keithrozario/Klayers/blob/master/部署/python3.8/arns/us-east-1.csv]。在我的例子中是 python 3.8 和 us-east-1 区域。

    https://i.imgur.com/RSjva28.jpg

    在这种情况下,arn 是: arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38Pillow:5

    转到这部分的 lambda 并单击图层: https://i.imgur.com/mTyPHWP.jpg

    你会看到这个:

    https://i.imgur.com/Iw8gNDa.jpg

    点击添加层->指定arn->粘贴arn

    https://i.imgur.com/y8C7OmE.jpg

    就是这样,现在你的 lambda 函数可以正常运行了。

    (部署和测试)

    https://i.imgur.com/Y8hvqa0.jpg

    【讨论】:

      【解决方案5】:

      使用 python 3.6 而不是 3.7 只会给我一个不同的错误。由于构建方式的原因,AWS lambda 似乎缺少一些组件。

      对我有用的 5 分钟解决方案:

      保存所有内容,它应该可以正常工作!但是,您必须确保重新部署 lambda 以某种方式保留该层。


      感谢这篇拯救生命的博文https://medium.com/@derekurizar/aws-lambda-python-pil-cannot-import-name-imaging-11b2377d31c4

      【讨论】:

      • 虽然我不喜欢依赖其他人维护的外部资源进行生产部署,但这救了我的命。 +1!
      • 不要忘记从您的 requirements.txt 中删除 Pillow 。否则,arn 将被覆盖,并且您不断收到相同的错误
      猜你喜欢
      • 2021-03-07
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      相关资源
      最近更新 更多