草庐IT

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

coder 2023-08-17 原文

背景

过去几天我一直在努力部署一个使用 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' 出现了同样的错误。

进一步尝试

然后我按照 this resource 的指示进行操作和 this .我也尝试使用 virualenv甚至 lambda-uploader .

很奇怪,我得到了同样的错误!我在这里没有选择,感觉要么我在做一些愚蠢的事情,要么这在目前的 Lambda-Python3.6 上是不可能的(虽然我无法想象其他人还没有在 py3.6-lambda 中使用 Pillow ......)

如有任何信息、帮助或通用资源,我们将不胜感激!

最佳答案

基本上,您必须使用 Docker 或更好的 EC2 实例来编译库(例如,PIL)。

  1. 像这样启动一个 Docker 容器:docker run --rm -it -v "%cd%:/code"lambci/lambda:build-python3.6 sh

  2. 在那里,导航到/code 目录 (cd/code),创建一个 virtualenv (virtualenv env),激活它 (source env/bin/activate) 最后,安装你的库 (pip install pillow)。

  3. 安装库后,您可以退出容器。这里的秘诀是将您的包库移动到根文件夹(您的主要 .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"]

入口点.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

关于python - 让 PIL/Pillow 4.2.1 正确上传到 AWS Lambda Py3.6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45473501/

有关python - 让 PIL/Pillow 4.2.1 正确上传到 AWS Lambda Py3.6的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  3. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  4. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  5. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  6. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

随机推荐