![](/img/trans.png)
[英]How to return binary data from lambda function in AWS in Python?
[英]How to import lxml from precompiled binary on AWS Lambda?
我试图在 Python 中导入lxml
库以执行 AWS Lambda function 但我收到以下错误: [ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'lxml'
。 为了解决这个问题,我遵循了这个SO answer 的建议,并使用了来自以下repo的预编译二进制文件。
我使用了那个 repo 中的lxml_amazon_binaries.zip
文件,它具有以下结构:
lxml_amazon_binaries
├── lxml
└── usr
我将整个zip
文件上传到 AWS Lambda 层,创建了一个新的 Lambda function,并使用简单from lxml import etree
进行了测试,这导致了上述错误。
我是否正确上传/使用这些二进制文件? 我不确定是什么导致了错误。 使用不同的 Python 运行时没有帮助。
创建lxml
层的最可靠方法是使用 Docker,如AWS 博客中所述。 具体来说,经过验证的步骤是(在 Linux 上执行,但只要你有 Docker,windows 也应该可以工作):
创建空文件夹,例如mylayer
。
Go 到文件夹并创建内容为requirements.txt
的文件
lxml
该命令将为 python3.8 创建层:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
zip -9 -r mylayer.zip python
在 AWS 控制台中基于mylayer.zip
创建 lambda 层。 不要忘记为python3.8
指定Compatible runtime
。
将步骤 5 中创建的图层添加到您的 function。
我使用您的代码测试了该层:
from lxml import etree
def lambda_handler(event, context):
root = etree.Element("root")
root.append( etree.Element("child1") )
print(etree.tostring(root, pretty_print=True))
它工作正常:
b'<root>\n <child1/>\n</root>\n'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.