【问题标题】:AWS lambda: "Unable to import module 'app': No module named 'models'"AWS lambda:“无法导入模块‘app’:没有名为‘models’的模块”
【发布时间】:2021-08-16 13:57:00
【问题描述】:

我想用 aws sam 部署一个 pytorch 模型。我的文件夹结构如下:

├── Dockerfile
├── __init__.py
├── app.py
├── models
│   ├── common.py
│   ├── experimental.py
│   └── yolo.py
├── requirements.txt
└── utils
    ├── autoanchor.py
    ├── datasets.py
    ├── general.py
    ├── google_utils.py
    ├── metrics.py
    ├── plots.py
    └── torch_utils.py

如您所见,我有几个本地依赖项。我的 Dockerfile 如下所示:

FROM public.ecr.aws/lambda/python:3.8

COPY app.py requirements.txt ./
ADD models utils ./

RUN python3.8 -m pip install -r requirements.txt -t .

# Command can be overwritten by providing a different command in the template directly.
CMD ["app.lambda_handler"]

app.py 中的代码从models 导入模块。不幸的是,这不起作用并产生以下错误:

"errorMessage": "Unable to import module 'app': No module named 'models'"

我也尝试对目录modelsutils 使用COPY 而不是ADD,但它会导致相同的错误。我该如何解决这个问题?

【问题讨论】:

  • 此代码在本地工作?似乎文件夹的 Python 打包不起作用,所以 lambda 无法找到 models
  • 不,它在本地也不起作用。但是models不是一个python包,而是一个目录..所以我猜到,目录没有正确构建?

标签: amazon-web-services docker aws-lambda dockerfile aws-sam


【解决方案1】:

您缺少的是,如果您尝试将文件夹作为包加载,则必须在 Python 中创建正确的打包。否则,您可以将所有文件一一导入您的app.py

创建包的步骤:

  1. 创建文件夹名称models
  2. models文件夹中创建__init__.py文件
  3. 创建您的其他文件,例如 yolo.pyexperimental.pycommon.py
  4. 然后将所有四个加载到__init__.py 文件中,如下所示
from common import *
from experimental import *
from yolo import *

  1. 然后您可以在app.py 中使用它,例如import modelsfrom models import *

注意:将所有文件放在文件夹中不像 Python 中的包那样工作。

参考代码:https://github.com/aviboy2006/flask-rest-api

【讨论】:

  • 感谢您的回答,这确实是明智的。但是,由于某种原因,它并没有解决问题.. 尽管创建了 init 文件,我仍然遇到同样的错误
  • 你在本地运行?
  • 它也不在本地运行,我得到完全相同的错误:/
  • 它应该运行我尝试了相同的文件夹和文件结构
  • 好吧,我想通了:我必须这样做 ADD models modelsADD utils utils。结合您的解决方案,它现在可以工作了 :) 感谢您的帮助!