您可以在此处使用PIL的预编译版本:https://github.com/Miserlou/lambda-packages
背景
过去几天,我一直在努力部署使用Pillow的Lambda,而我正在使用Python 3.6进行部署。同样值得注意的是,我正在Windows 10环境中进行开发。
首次尝试
首先,通过执行以下操作让pip将软件包严格安装在我的工作区中:
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\pillow"
我有其他软件包,并尝试在同一庄园中安装这些软件包,其中一个特别是praw
,而我这样做的方式是:
pip3 install praw -t "D:\Work and Projects\...\...\<projectdir>\praw"
将项目内容压缩在一起后,我将程序包上传到Lambda,并且在我的第一次测试中收到错误:
无法导入模块'motw_lambda':无法导入名称'_imaging'
然后,我删除了Pillow软件包,以查看此问题的根源(Pillow或praw或其他软件包之一)。删除枕头后,执行成功。然后,我删除了我包中的pillow
包并尝试:
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\PIL"
和
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\Pillow"
但是软件包'_imaging'
出现了相同的错误。
进一步尝试
然后我按照this resource和this的指示进行操作。我也尝试使用virualenv甚至lambda-uploader。
很奇怪,我遇到相同的错误!我在这里已经没有选择,并且感到我正在做一些愚蠢的事情,或者当前在Lambda-Python3.6上无法做到这一点(尽管我可以做到) t图像中的其他人还没有在py3.6-lambda中使用枕头了...)
任何信息,帮助或一般资源将不胜感激!
基本上,您必须使用Docker甚至是更好的EC2实例来编译库(例如PIL)。>
启动这样的Docker容器:docker run --rm -it -v "%cd%:/code" lambci/lambda:build-python3.6 sh
在里面,导航至/ code目录(cd /code
),创建一个virtualenv(virtualenv env
),将其激活(source env/bin/activate
),最后,安装您的库(pip install pillow
)。
一旦安装了库,就可以退出容器。这里的秘密是将包库移动到根文件夹(主.py文件所在的位置)。例如,将文件夹env/lib/python3.6/site-packages/PIL
移至根目录。
然后,将您的PIL文件夹与.py文件一起压缩,就可以设置了!
我刚做了,并在这里完整记录了下来:https://learn-serverless.org/post/deploying-pillow-aws-lambda/
您可以在此处使用PIL的预编译版本:https://github.com/Miserlou/lambda-packages
只需将PIL文件夹解压缩到部署程序包中,它就可以正常工作。
对于同样不熟悉aws python并遇到此问题的其他人,您可以使用layers功能,并且这里可以链接到现有的图层,这对我有用。
特别是对us-east-1的枕头:
[arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-Pillow:2
您可以在此处使用PIL的预编译版本:https://github.com/Miserlou/lambda-packages
对于同样不熟悉aws python并遇到此问题的其他人,您可以使用layers功能,并且这里可以链接到现有的图层,这对我有用。