Python Lambda上传器:无法导入模块';创建缩略图';:无法导入名称\u映像

Python Lambda上传器:无法导入模块';创建缩略图';:无法导入名称\u映像,python,amazon-web-services,lambda,python-imaging-library,Python,Amazon Web Services,Lambda,Python Imaging Library,我正在使用编写python lambda代码并将zip移动到AWS。 我创建了一个包含我的jar文件和zip文件夹的结构,如下所示 我使用的代码来自AWS门户,使用的是PIL类。作为一项要求,我在Lambda uploader中包含了Pillow库,但是当我通过导入创建的zip文件在Lambda控制台上创建Lambda函数时,我得到了以下错误消息。感谢您的帮助 错误: START RequestId: e4893543-93aa-11e7-b4b9-89453f1042aa Version:

我正在使用编写python lambda代码并将zip移动到AWS。 我创建了一个包含我的jar文件和zip文件夹的结构,如下所示

我使用的代码来自AWS门户,使用的是PIL类。作为一项要求,我在Lambda uploader中包含了Pillow库,但是当我通过导入创建的zip文件在Lambda控制台上创建Lambda函数时,我得到了以下错误消息。感谢您的帮助

错误:

START RequestId: e4893543-93aa-11e7-b4b9-89453f1042aa Version: $LATEST
Unable to import module 'CreateThumbnail': cannot import name _imaging

END RequestId: e4893543-93aa-11e7-b4b9-89453f1042aa
REPORT RequestId: e4893543-93aa-11e7-b4b9-89453f1042aa  Duration: 0.44 ms   Billed Duration: 100 ms     Memory Size: 512 MB Max Memory Used: 33 MB
兰姆达·乔森

{
  "name": "CreateThumbnail",
  "description": "It does things",
  "region": "us-east-1",
  "runtime": "python2.7",
  "handler": "CreateThumbnail.lambda_handler",
  "role": "arn:aws:iam::0000000000:role/LambdaTest",
  "requirements": ["Pillow"],
  "ignore": [
    "circle\\.yml$",
    "\\.git$",
    "/.*\\.pyc$"
  ],
  "timeout": 30,
  "memory": 512
}
python代码:

from __future__ import print_function
import boto3
import os
import sys
import uuid
from PIL import Image
import PIL.Image

s3_client = boto3.client('s3')

def resize_image(image_path, resized_path):
    with Image.open(image_path) as image:
        image.thumbnail(tuple(x / 2 for x in image.size))
        image.save(resized_path)

def handler(event, context):
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key'] 
        download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
        upload_path = '/tmp/resized-{}'.format(key)

        s3_client.download_file(bucket, key, download_path)
        resize_image(download_path, upload_path)
        s3_client.upload_file(upload_path, '{}resized'.format(bucket), key)

我遇到了完全相同的问题,我解决了它。tl;dr版本在末尾。
_imaging是一个动态链接的共享对象库(具有.so扩展名)。这大致相当于Windows DLL模块的Linux版本。您可以在PIL文件夹中查看此模块。
问题是,这些.so文件是针对本地计算机的体系结构的编译文件。因此,如果您在Windows上安装pip,则动态链接库不能用于任何其他操作系统或体系结构。
AWS lambda使用执行环境。不是Ubuntu,而是亚马逊Linux。因此,如果您想在lambda上使用动态链接的共享对象库,最好是在类似的环境中安装所有库。谢天谢地,EC2提供了与lambda完全相同的执行环境。因此,我派生了一个临时EC2实例。Remote通过SSH/Putty登录并安装所有依赖项。然后我把它和我自己的代码一起压缩并发布到lambda。我的程序现在运行良好

TL;DR

  • 使用Amazon Linux执行环境派生一个EC2实例
  • 通过SSH/Putty远程日志记录来安装诸如Pillow之类的依赖项
  • 将您自己的代码与库一起压缩,并在Lambda上发布

在整个过程的中途,我遇到了马修·佩里(Matthew Perry)的一封信,解释了整个过程

您还可以从以下位置使用PIL的预编译版本:

只需将PIL文件夹解压缩到部署包中,它就可以工作了


这不是最优雅的解决方案,但它可以节省您在EC2实例上编译的时间。

检查:我对python了解不多,但是在java中如果我需要外部库,那么我们需要创建包含所有外部库的fat jar/zip文件。谢谢。我在这里也这么做了。我在我的问题中包括了zip文件结构。我在下面的链接中发现了类似的问题:这对我很有用。只需下载.tar.gz,将内容解压缩到我的项目中(不是父文件夹,我将所有的.so文件和PIL文件夹解压缩到项目的根目录中),并将其压缩。它跑起来很有魅力。