2017-09-07 212 views
1

我使用Lambda-uploader来编写python lambda代码并将zip移动到AWS。 我创建了一个包含我的jar文件和zip文件夹结构,如下所示。Lambda-Uploader:无法导入模块'CreateThumbnail':无法导入名称_imaging

enter image description here

我正在使用的代码是从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 

lambda.josn

{ 
    "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) 
+0

检查:http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html 我不知道python太多,但在java如果我需要外部库,那么我们需要创建包含所有外部库的胖jar/zip文件。 – Suyash

+0

谢谢。我在这里也是这样。我在我的问题中包含了zip文件结构。 – sina

+0

我在下面的链接中发现了类似的问题: https://stackoverflow.com/questions/25340698/importerror-cannot-import-name-imaging – Suyash

回答

5

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

TL; DR

  • 分拆与Amazon Linux的执行环境的EC2实例。
  • 通过SSH/Putty远程登录来安装像Pillow这样的依赖关系。
  • 将您自己的代码与库一起编码并在Lambda上发布。

通过这个过程的一半,我遇到了马修派瑞解释整个过程的nice blog