dov*_*vic 12 python python-imaging-library pillow aws-lambda
背景
在过去的几天里,我一直在努力部署使用Pillow的Lambda,而我正在使用Python 3.6进行部署.值得注意的是,我正在Windows 10环境中开发它.
第一次尝试
我开始通过执行以下操作将pip安装在我的工作区中严格安装:
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\pillow"
Run Code Online (Sandbox Code Playgroud)
我有其他软件包,并尝试在同一庄园中安装软件包,其中一个特别是praw,我这样做:
pip3 install praw -t "D:\Work and Projects\...\...\<projectdir>\praw"
Run Code Online (Sandbox Code Playgroud)
在将我的项目内容压缩到一起之后,我将我的包上传到Lambda并在第一次测试时收到错误:
无法导入模块'motw_lambda':无法导入名称'_imaging'
然后,我移除了Pillow包,试图查看这个问题源于哪里(Pillow或praw或其他一个包).删除Pillow后,执行成功.然后我在pillow包中删除了包并尝试:
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\PIL"
Run Code Online (Sandbox Code Playgroud)
和
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\Pillow"
Run Code Online (Sandbox Code Playgroud)
但是与包有同样的错误'_imaging'.
进一步尝试
然后我按照这个资源的指示和这个.我也尝试过使用virualenv甚至是lambda-uploader.
奇怪的是,我得到了同样的错误!我在这里都没有选择,感觉我正在做一些愚蠢的事情,或者目前在Lambda-Python3.6上这是不可能的(虽然我无法想象其他人没有在py3.6-中使用过枕头lambda还......)
任何信息,帮助或通用资源将不胜感激!
Die*_*cic 17
基本上,您必须使用Docker或更好的EC2实例来编译库(例如,PIL).
像这样启动一个Docker容器: docker run --rm -it -v "%cd%:/code" lambci/lambda:build-python3.6 sh
在那里,导航到/ code dir(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/
对于其他刚接触 aws python 并遇到此问题的人,您可以使用图层功能,这里有现有的图层您可以链接到,这对我有用。
https://github.com/keithrozario/Klayers
专门针对 us-east-1 的枕头:
arn:aws:lambda:us-east-1:770693421928:层:Klayers-python38-Pillow:2
终于找到了一个非常简单的解决方案。诀窍是将 Pillow 安装在本地目录中,将其压缩,然后创建 Lambda 层。现在,您本地运行的 Python 版本必须与 Lambda 的 Python 版本匹配。就我而言,本地有 Python 3.10,Lambda 是 3.9,所以我在本地安装了 3.9 只是为了用于此目的。
在 Mac 上,我使用 homebrew 安装 pyenv 以获得 3.9,但是你想安装什么都可以。
!Only needed if you do not have the correct version of Python locally!
brew install pyenv
pyenv install 3.9 (or whatever version)
(if you do this, then you can run 'pyenv local 3.9.16' or whatever version you installed, then 'Python3 --versions' should show that version.
Run Code Online (Sandbox Code Playgroud)
例如,pyenv 安装在 MY_USER_DIR/.pyenv/versions/3.9.16/bin/python3 中,或者您可以使用 pyenv 将您的 env 设置为使用特定版本。
然后 cd 到一个空目录,并运行以下命令:
YOUR_LOCAL_PATH_TO_CORRECT_VERSION/python3 -m pip install \
--platform manylinux2014_aarch64 \
--target=./python/lib/python3.9/site-packages \
--implementation cp \
--python 3.9 \
--only-binary=:all: --upgrade \
Pillow
Run Code Online (Sandbox Code Playgroud)
在上面,manylinux2014_aarch64 用于 ARM 运行时。因此,您的 Lambda 必须设置为该值,或者找到 X86 版本的值。如果您使用的不是 3.9,请将其更改为您的版本。
现在您可以为图层创建 zip 了。只需运行以下命令,然后将 zip 上传到图层,并确保为 Lambda 选择正确的 Python 版本和架构。
in the same dir you ran the above command:
zip -r ../pillowLayer.zip .
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4254 次 |
| 最近记录: |