AWS lambda无法导入模块'lambda_function':没有名为PIL的模块

时间:2018-06-07 06:35:09

标签: amazon-web-services amazon-s3 aws-lambda python-imaging-library amazon-rekognition

我正在使用SearchFacesbyimage的lambda函数我正在使用此文档https://aws.amazon.com/blogs/machine-learning/build-your-own-face-recognition-service-using-amazon-rekognition/

我要使用此

进行比较
from PIL import Image

我收到了这个错误  Unable to import module 'lambda_function': No module named PIL

4 个答案:

答案 0 :(得分:1)

您收到此错误,因为Python 2.x的PIL或3.x的PILLOW不是python lambda环境中可用的标准库。

要使用这样的库,您必须创建所需库的自定义部署包以及要部署的python代码。该软件包可以在 docker 中轻松制作,也可以使用 EC2 实例轻松制作。

以下是如何在 EC2

上制作该部署包的过程
  1. 假设您的文件名为 CreateThumbnail.py

  2. 如果您的源代码位于本地主机上,请将其复制到EC2。

    scp -i key.pem /path/to/my_code.py ec2-user @ public-ip-address:〜/ CreateThumbnail.py

  3. 通过SSH连接到64位Amazon Linux实例。

    ssh -i key.pem ec2-user @ public-ip-address

  4. 使用以下步骤安装Python 3.6和virtualenv:

    a) sudo yum install -y gcc zlib zlib-devel openssl openssl-devel

    b) wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

    c) tar -xzvf Python-3.6.1.tgz

    d) cd Python-3.6.1&& ./configure&&使

    e) sudo make install f sudo / usr / local / bin / pip3 install virtualenv

  5. 选择通过pip3

    安装的虚拟环境

    / usr / local / bin / virtualenv~ / shrink_venv

    来源〜/ shrink_venv / bin / activate

  6. 在虚拟环境中安装库

    pip install Pillow

    pip install boto3

  7. 将lib和lib64 site-packages的内容添加到.zip文件中。请注意,以下步骤假定您使用的是Python运行时版本3.6。如果您使用的是2.7版,则需要进行相应的更新。

    cd $ VIRTUAL_ENV / lib / python3.6 / site-packages

    zip -r9~ / CreateThumbnail.zip

    注意 - 要包含所有隐藏文件,请使用以下选项:

    zip -r9~ / CreateThumbnail.zip

  8. 将您的python代码添加到.zip文件

    cd~

    zip -g CreateThumbnail.zip CreateThumbnail.py

  9. 现在 CreateThumbnail.zip 是您的自定义部署包,只需将其复制到s3并将其上传到您的lambda。

    此示例取自官方AWS文档  https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html

答案 1 :(得分:0)

即使文档清楚地概述了用于为lambda函数手动创建zip工件的步骤。该解决方案不是很可扩展。我一直在使用一个名为juniper的非常小的程序包来无缝打包python lambda函数。

在您的特定情况下,这是您需要采取的步骤:

假设这是您的文件夹结构:

.
├── manifest.yml
├── src
│   ├── requirements.txt
│   ├── lambda_function.py

在requirements.txt中,您将仅包括lambda函数的依赖项,在这种情况下,包括PIL库。

Pillow==6.0.0

现在,您只需要创建一个小文件来告诉juniper在zip文件中包含什么内容。 manifest.yml如下所示:

functions:
  reko:
    requirements: ./src/requirements.txt.
    include:
    - ./src/lambda_function.py

现在,您需要在本地环境中pip install juniper。执行cli命令:

juni build

杜松将创建:./dist/reko.zip。该文件将包含您的源代码以及您的requirements.txt文件中包含的所有依赖项。

默认情况下,杜松使用docker容器,而build命令将使用python3.6。您可以覆盖默认设置。

答案 2 :(得分:0)

我也遇到了同样的问题。您可以在此处执行两个步骤:手动打包和自动打包打包。

手动步骤将涉及创建正确的virtualenv并在该虚拟环境中安装依赖项。然后压缩所有内容并上传到AWS。

要使内容自动化,我总是更喜欢使用无服务器框架来打包和部署Lambda函数。特别是python-requirements-plugin有助于打包。但是我必须指定以下内容来告诉框架在docker容器中构建,并且不要剥离任何库:

custom:
  pythonRequirements:
    dockerizePip: true
    strip: false

答案 3 :(得分:0)

正如这里大多数答案已经提到的那样,AWS Lambda执行环境仅包含Python内置包和boto3,而没有其他内容。

要包含外部软件包,您需要自己构建外部软件包,方法是构建外部软件包并将其包含在函数上传中,也可以将它们打包为层。还请记住,这些软件包本身需要针对Amazon Linux构建。

如果您使用的是python3.7,则可以使用此公开可用的枕头层: https://github.com/keithrozario/Klayers