背景
在过去的几天里,我一直在努力部署一个使用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后,执行成功。然后我删除了软件包中的pillow
软件包,并尝试:
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\PIL"
和
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\Pillow"
但得到了同样的错误与包'_imaging'
。
进一步尝试
然后,我按照X1 E0 F1 X和X1 E1 F1 X的指示操作。我还尝试使用X1 E2 F1 X,甚至X1 E3 F1 X。
奇怪的是,* 我得到了同样的错误!* 我在这里的所有选项,并觉得要么我正在做一些愚蠢的,或者这是不可能的Lambda-Python3.6目前(虽然我不能想象别人 * 还没有 * 使用枕头在py3.6-lambda尚未...)
任何信息,帮助,或通用资源将不胜感激!
4条答案
按热度按时间o2g1uqev1#
基本上,您必须使用Docker或更好的EC2示例来编译库(例如,PIL)。
1.启动Docker容器,如下所示:
docker run --rm -it -v "%cd%:/code" lambci/lambda:build-python3.6 sh
1.在里面,导航到/code目录(
cd /code
),创建一个virtualenv(virtualenv env
),激活它(source env/bin/activate
),最后安装你的库(pip install pillow
)。1.一旦你安装了你的库,你就可以退出容器了。这里的秘诀是把你的包库移到根文件夹(你的主.py文件所在的地方)。例如,把文件夹
env/lib/python3.6/site-packages/PIL
移到根目录。然后,将PIL文件夹与.py文件一起压缩,就完成了!
完整示例:
以下示例编译并压缩PIL和其他常见Python库,以便在AWS Lambda中运行。
若要建置(Windows):
fdbelqdn2#
对于其他任何刚接触aws python并遇到这个问题的人来说,你可以使用layers特性,这里有现有的层可以链接,这对我很有效。
https://github.com/keithrozario/Klayers
枕头上专门放着美东-1:
第一个:第二个:第三个:第四个:第五个:第六个:第七个:第八个
ukqbszuj3#
您可以使用PIL的预编译版本,该版本可从以下站点获得:https://github.com/Miserlou/lambda-packages
只需将PIL文件夹解压缩到部署包中,它就可以工作了。
3htmauhk4#
最后找到了一个非常简单的解决方案。诀窍是在本地的一个目录中安装Pillow,压缩它,然后创建一个Lambda Layer。现在,你在本地运行的Python版本必须与Lambda的Python版本相匹配。在我的本地例子中,我有Python 3.10,而Lambda是3.9,所以我在本地安装3.9只是为了使用它。
在Mac上,我使用自制软件安装pyenv来获得3. 9,但无论你想安装什么都可以。
例如,pyenv安装在MY_USER_DIR/.pyenv/versions/3.9.16/bin/python3中,或者您可以将env设置为,并使用pyenv来使用特定版本。
然后使用cd命令进入一个空目录,并运行以下命令:
在上面的例子中,manylinux2014_aarch64是ARM运行时的,所以你的Lambda必须设置为这个值,或者找到X86版本的值。如果你没有使用3.9,那么就把它改为你的版本。
现在你可以为你的层创建zip文件了,只需运行下面的命令,然后上传zip文件到一个层,并确保你为你的Lambda选择了正确的Python版本和架构。