Проблемы с загрузкой локальных модулей только с помощью AWS Lambda - PullRequest
0 голосов
/ 17 декабря 2018

структура приложения:

.
├── Makefile
├── Pipfile
├── Pipfile.lock
├── README.md
├── template.yaml
├── tests
│   ├── __init__.py
│   └── unit
│       └── lambda_application
│           ├── test_handler.py
│           └── test_parent_child_class.py
└── lambda_application
    ├── __init__.py
    ├── first_child_class.py
    ├── lambda_function.py
    ├── second_child_class.py
    ├── requirements.txt
    └── parent_class.py

4 directories, 14 files

Пример кода из lambda_function.py:

import os
import json
from hashlib import sha256
import boto3
from requests import Session
from .first_child_class import FirstChildClass


def lambda_handler(event, context):
    # Do some stuff.

Как есть, я получаю сообщение об ошибке «Невозможно импортировать модуль« lambda_function »», но еслиЯ закомментировал последний импорт, «из .first_child_class import FirstChildClass», он может обойти эту часть и получить сообщение об ошибке, что я не загрузил модуль для этого класса.

Мне только кажется, что я получаюэта ошибка при запуске в образе док-станции lambci / lambda: python3.7 и при развертывании в AWS.Все мои тесты пройдены, и он может импортировать модуль без проблем.

Что-то, что я должен загрузить / настроить в __init__.py файле?

РЕДАКТИРОВАТЬ Я изменил имена некоторых файлов, чтобы опубликовать их здесь.

1 Ответ

0 голосов
/ 17 декабря 2018

Здесь вы используете relative import, который работает, если код, который вы выполняете, находится в модуле.Однако, поскольку ваш код выполняется не как модуль, ваш AWS Lambda дает сбой.

https://stackoverflow.com/a/73149/6391078

При быстром запуске локально возникла следующая ошибка:

PYTHON 3.6

Traceback (most recent call last):
  File "lambda_function.py", line 4, in <module>
    from .first_child_class import FirstChildClass
ModuleNotFoundError: No module named '__main__.first_child_class'; '__main__' is not a package

Ваши тесты пройдены, потому что ваш набор тестов импортирует файл как module из папки lambda_application, которая обрабатывается как пакет в модуле тестирования


Thisзаставил меня двигаться в правильном направлении, но не совсем дал мне ответ, но привел меня к ответу, поэтому я подумал, что обновлю то, что нашел здесь.

Я не пробовал, но из чегоЯ обнаружил, я считаю, что:

from first_child_class import FirstChildClass

было бы самым простым решением.

В итоге я переместил классы в подкаталог и по существусделал то же, что и выше, но с добавленным именем пакета.

Итак, структура файла изменилась на:

.
├── Makefile
├── Pipfile
├── Pipfile.lock
├── README.md
├── template.yaml
├── tests
│   ├── __init__.py
│   └── unit
│       └── lambda_application
│           ├── test_handler.py
│           └── test_parent_child_class.py
└── lambda_application
    ├── __init__.py
    └── lib
        ├── first_child_class.py
        ├── second_child_class.py
        └── parent_class.py
    ├── lambda_function.py
    └── requirements.txt

, и мой импорт стал from lib.first_child_class import FirstChildClass

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...