获取 PIL/Pillow 4.2.1 以正确上传到 AWS Lambda Py3.6
Getting PIL/Pillow 4.2.1 to upload properly to AWS Lambda Py3.6
背景
过去几天我一直在努力部署一个使用 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,在第一次测试时我收到了错误:
Unable to import module 'motw_lambda': cannot import name '_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'
出现了同样的错误。
进一步尝试
然后我按照 and this. I also tried using virualenv and even lambda-uploader 的指示进行操作。
很奇怪,我得到了同样的错误!我在这里没有选择,觉得我在做一些愚蠢的事情,或者这在 Lambda 上是不可能的- Python3.6 目前(虽然我无法想象其他人 还没有 在 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 文件一起压缩,大功告成!
完整示例:
以下示例将 PIL 和其他常见 Python 库编译并压缩为 AWS Lambda 中的 运行。
Docker文件:
FROM lambci/lambda:build-python3.6
WORKDIR /code
CMD ["sh", "entrypoint.sh"]
entrypoint.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
您可以使用此处提供的预编译版本的 PIL:
https://github.com/Miserlou/lambda-packages
只需将 PIL 文件夹解压到部署包中即可。
对于其他刚接触 aws python 和 运行 的人来说,您可以使用层功能,这里有现有的层,您可以 link 和这个为我工作。
https://github.com/keithrozario/Klayers
us-east-1 上的枕头:
arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-Pillow:2
背景
过去几天我一直在努力部署一个使用 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,在第一次测试时我收到了错误:
Unable to import module 'motw_lambda': cannot import name '_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'
出现了同样的错误。
进一步尝试
然后我按照
很奇怪,我得到了同样的错误!我在这里没有选择,觉得我在做一些愚蠢的事情,或者这在 Lambda 上是不可能的- Python3.6 目前(虽然我无法想象其他人 还没有 在 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 文件一起压缩,大功告成!
完整示例:
以下示例将 PIL 和其他常见 Python 库编译并压缩为 AWS Lambda 中的 运行。
Docker文件:
FROM lambci/lambda:build-python3.6
WORKDIR /code
CMD ["sh", "entrypoint.sh"]
entrypoint.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
您可以使用此处提供的预编译版本的 PIL: https://github.com/Miserlou/lambda-packages
只需将 PIL 文件夹解压到部署包中即可。
对于其他刚接触 aws python 和 运行 的人来说,您可以使用层功能,这里有现有的层,您可以 link 和这个为我工作。
https://github.com/keithrozario/Klayers
us-east-1 上的枕头:
arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-Pillow:2