AWS лямбда: импорт внешней python библиотеки с использованием подпроцесса делает программу слишком медленной - PullRequest
0 голосов
/ 05 мая 2020

Мой вариант использования:

Мне нужно выполнить несколько сценариев python на AWS Lambda. Я использую subprocess.check_output для выполнения этих сценариев, и они отлично работают. Проблема возникает, когда скрипты имеют некоторые внешние зависимости (не от Lambda по умолчанию), например numpy.

Итак, я создал свой пакет развертывания с внешними библиотеками, которые теперь находятся в / opt / python / lib / python2 .7 / site-packages , и я могу импортировать их в свою функцию-обработчик.

Но когда я выполняю сценарии, мои сценарии не могут найти эти библиотеки. Итак, я огляделся и обнаружил, что подпроцесс не сохраняет PYTHONPATH.

Итак, теперь я передаю параметр env в subprocess.check_output, через который эти скрипты могут находить библиотеки.

Но проблема в том, что это делает выполнение очень медленным. (например, программа выполняется за 300 мсек, которая не имеет никакого импорта внешних зависимостей, но с импортом внешней зависимости это занимает 4883,81 мсек).

Моя функция-обработчик выглядит так:

import subprocess

def main(event, context):
    # Omitting creation of script.py in /tmp directory. 
    print(subprocess.Popen(["/usr/bin/python", "/tmp/script.py"], env={'PYTHONPATH': '/opt/python/lib/python2.7/site-packages'}).communicate())

Также пробовал:

  1. Изменение рабочего каталога с помощью параметра **cwd**.
  2. Установка внешних зависимостей в ту же папку, что и функция обработчика.
  3. Пробовал с subprocess.check_output вместо Popen

Любое лидерство приветствуется. Заранее спасибо. Также дайте мне знать, если вам нужна другая информация.

Изменить: в приведенных выше примерах используется слой лямбда для пакетов python, но я пробовал без слоя лямбда (где Python пакеты находятся в той же папке, что и handler.py)

...