python - Python 中的 AWS Lambda:在 Lambda 函数处理程序中导入父包/目录
问题描述
我在使用 AWS SAM 和 Python 3.8 作为运行时创建的无服务器应用程序(避免混乱的最简单应用程序)中有如下目录结构:
├── common
│ └── a.py
├── hello_world
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
└── template.yaml
我想common/a.py
在 Lambda 处理程序中导入模块 - hello_world/app.py
。现在我知道我可以通过添加or的路径在 Python 中正常导入它,但是当代码在 Docker 容器内的 Lambda 中运行时它不起作用。调用时,Lambda 处理程序函数在目录内运行,不考虑文件夹结构。PYTHONPATH
sys.path
/var/task
我尝试插入/var/task/common
, /var/common
,/var
甚至像这样/common
以sys.path
编程方式插入:
import sys
sys.path.insert(0, '/var/task/common')
from common.a import Alpha
但我仍然收到错误:
ModuleNotFoundError: No module named 'common'
我知道Lambda 层,但考虑到我的场景,我想直接引用多个 Lambda 函数中的通用代码,而不需要上传到层。我想在无服务器框架中但在 AWS SAM中拥有类似serverless-python-requirements
插件的东西。
所以我的问题是,我应该如何将此路径添加common
到PYTHONPATH
or sys.path
?或者是否有替代解决方法,例如[serverless-python-requirements][3]
直接在父文件夹中导入模块而不使用 Lambda 层?
解决方案
我在包依赖项方面遇到了类似的问题,根据 AWS 知识中心,您应该将所有项目放在根级别:
您可能需要创建一个部署包,其中包含位于 .zip 文件根目录中的功能模块,并对所有文件具有读取和执行权限。
根据https://aws.amazon.com/premiumsupport/knowledge-center/build-python-lambda-deployment-package/
推荐阅读
- python-3.x - 在测试运行期间从 Chrome 捕获日志。Python
- node.js - 即使我安装了 cors 并且设置了标头,也会出现 CORS 错误
- php - 谷歌“安全浏览查找 API”返回空数组
- angular - 错误 TS2339:“任何”类型上不存在属性“flatMap”
- json - Mongoose 在 Array 中选择具有特定属性的对象
- graphql - HotChocolate(GraphQL)模式优先处理复杂类型
- python - 如何安排每天在 Azure ML SDK 中运行的实验
- php - 如何在 Laravel 中处理用户喜欢另一个用户逻辑?
- jquery - 在 wordpress 开发中使用 jQuery 还可以吗?
- javascript - 为什么我按下按钮时页面会刷新?