python 将PIL/Pillow 4.2.1正确上传到AWS Lambda Py3.6

ncgqoxb0  于 2022-12-10  发布在  Python
关注(0)|答案(4)|浏览(151)

背景

在过去的几天里,我一直在努力部署一个使用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尚未...)
任何信息,帮助,或通用资源将不胜感激!

o2g1uqev

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中运行。

  • 停靠文件:*
FROM lambci/lambda:build-python3.6
WORKDIR /code
CMD ["sh", "entrypoint.sh"]
  • 入口点.sh:*
#!/bin/sh

set -ex

cd /code/

if [ ! -d "PIL" ]; then
    # Create virtual env, activate it and install PIL
    virtualenv env && source env/bin/activate && pip install pillow requests

    # Copy necessary files to the root folder
    rm -f build-output.zip
    #mkdir PIL
    cp -f -r env/lib/python3.6/site-packages/PIL .
    cp -f -r env/lib/python3.6/site-packages/requests .
    
    # below are the dependencies for the requests pkg
    cp -f -r env/lib/python3.6/site-packages/urllib3 .
    cp -f -r env/lib/python3.6/site-packages/certifi .
    cp -f -r env/lib/python3.6/site-packages/chardet .
    cp -f -r env/lib/python3.6/site-packages/idna .
    
    # Remove temp files
    rm -r env
fi

# ZIP it
zip -9 build-output *.py 
zip -9 -r build-output PIL
zip -9 -r build-output requests
zip -9 -r build-output urllib3
zip -9 -r build-output certifi
zip -9 -r build-output chardet
zip -9 -r build-output idna

若要建置(Windows):

docker build -t build_lambda .
docker run --rm -v "%cd%:/code" build_lambda
fdbelqdn

fdbelqdn2#

对于其他任何刚接触aws python并遇到这个问题的人来说,你可以使用layers特性,这里有现有的层可以链接,这对我很有效。
https://github.com/keithrozario/Klayers
枕头上专门放着美东-1:
第一个:第二个:第三个:第四个:第五个:第六个:第七个:第八个

ukqbszuj

ukqbszuj3#

您可以使用PIL的预编译版本,该版本可从以下站点获得:https://github.com/Miserlou/lambda-packages
只需将PIL文件夹解压缩到部署包中,它就可以工作了。

3htmauhk

3htmauhk4#

最后找到了一个非常简单的解决方案。诀窍是在本地的一个目录中安装Pillow,压缩它,然后创建一个Lambda Layer。现在,你在本地运行的Python版本必须与Lambda的Python版本相匹配。在我的本地例子中,我有Python 3.10,而Lambda是3.9,所以我在本地安装3.9只是为了使用它。
在Mac上,我使用自制软件安装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.

例如,pyenv安装在MY_USER_DIR/.pyenv/versions/3.9.16/bin/python3中,或者您可以将env设置为,并使用pyenv来使用特定版本。
然后使用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

在上面的例子中,manylinux2014_aarch64是ARM运行时的,所以你的Lambda必须设置为这个值,或者找到X86版本的值。如果你没有使用3.9,那么就把它改为你的版本。
现在你可以为你的层创建zip文件了,只需运行下面的命令,然后上传zip文件到一个层,并确保你为你的Lambda选择了正确的Python版本和架构。

in the same dir you ran the above command:
zip -r ../pillowLayer.zip .

相关问题