我使用带有AWS的Serverless框架部署多个函数,其中一个函数是用Python3编写的,并与我使用的几个外部库(redis、elasticsearch、dateutil)捆绑在一起。当在本地使用serverless invoke local --function function-name运行lambda时,它工作得很好。当使用python3 function.py在本地运行时,我得到的是错误ImportError: attempted relative import with no known parent package,因为我使用点前缀(即from .imported_file import one, two, three )导入本地python文件。当运行在云中即serverless invoke --function function-name上时,我得到的是错误Unable to import module 'function-name/function': No module named 'redis'。
由于我在同一个yaml文件下部署多个函数,所以每个函数都有自己的文件夹,并且使用以下设置进行部署:
package:
individually: true
exclude:
- "*/**"
- "*"在每项职能中:
package:
include:
- function-name/**文件结构如下所示:
service-name/
├─ function-name/
│ ├─ packages/
│ │ ├─ dateutil/
│ │ ├─ elasticsearch/
│ │ ├─ redis/
│ ├─ function.py
│ ├─ imported_file.py
├─ function-name-2/
├─ serverless.yaml我已经尝试了很多方法来克服这个问题,但最主要的是在lambda的根文件夹中拥有所有的文件和文件夹。问题是我无法做到这一点,因为使用上面的方法打包函数会强制文件结构如下所示:
./
├─ function-name/
│ ├─ packages/
│ ├─ function.py而不是这样:
./
├─ packages/
├─ function.py如果有人能向我解释发生了什么以及如何让它在云中工作,这将是非常感谢的。
发布于 2022-03-17 10:42:17
通过将PYTHONPATH设置为指向本地packages/文件夹的环境变量来解决此问题。
https://stackoverflow.com/questions/70415690
复制相似问题