Мой вариант использования:
Мне нужно выполнить несколько сценариев 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())
Также пробовал:
- Изменение рабочего каталога с помощью параметра
**cwd**
. - Установка внешних зависимостей в ту же папку, что и функция обработчика.
- Пробовал с subprocess.check_output вместо Popen
Любое лидерство приветствуется. Заранее спасибо. Также дайте мне знать, если вам нужна другая информация.
Изменить: в приведенных выше примерах используется слой лямбда для пакетов python, но я пробовал без слоя лямбда (где Python пакеты находятся в той же папке, что и handler.py)