#python #aws-lambda #sftp #pysftp #aws-lambda-layers
#python #aws-lambda #sftp #pysftp #aws-lambda-layers
Вопрос:
Я пытаюсь импортировать pysftp в свою функцию AWS lambda, но получаю следующую ошибку: «Невозможно импортировать модуль «app»: не удается импортировать имя»_bcrypt» из частично инициализированного модуля «bcrypt» (скорее всего, из-за циклического импорта)»
Единственный код, который я написал в своей функции, — это базовый код по умолчанию плюс мой импорт pysftp:
import json
import pysftp
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world",
# "location": ip.text.replace("n", "")
}),
}
bycrpt — это пакет, который автоматически устанавливается при установке pysftp, поэтому, когда я пытаюсь импортировать pysftp, он подключается к bycrpt. Способ, которым я подключил все свои библиотеки / пакеты к моему lambda, заключался в том, что я собрал все пакеты сайта в моей виртуальной среде в одну папку и загрузил ее в слой lambda. Затем я подключил этот слой к своей функции. Похоже, что соединение с уровнем работает, потому что до того, как я попробовал этот метод, я получал сообщение об ошибке «Невозможно импортировать модуль ‘app’: нет модуля с именем ‘pysftp'». Так что, по крайней мере, я больше не получаю эту ошибку.
Я также попытался сжать все мои пакеты и мою лямбда-функцию вместе в одну папку, а затем загрузить эту архивированную папку непосредственно в мою лямбда-функцию (как показано в этом видео: https://www.youtube.com/watch ?v = yyBSeGkuPqk), но я получаю ту же ошибку. Использование метода layer намного проще, поэтому я бы предпочел придерживаться этого.
Когда я попытался исследовать свою конкретную ошибку, все, что я действительно мог найти, это люди, которые указали свой импорт в неправильных порядках или импортировали пакеты несколько раз. Но я не делаю ни того, ни другого. Я просто пытаюсь заставить работать простой код по умолчанию.
Любая помощь очень ценится! Спасибо!
Комментарии:
1. Возможно, у вас есть собственный
bcrypt.py
файл, который скрывает установленный модуль.2. Большое вам спасибо за ваш ответ. Я просто дважды проверил каждый файл в заархивированной папке, и во всей заархивированной папке есть только один
_bcrypt.py
файл, который я загрузил в свой слой, и он находится вbcrypt
папке.
Ответ №1:
Кажется, для этого bcrypt
требуются библиотеки C или C . Проблема может быть связана с этим. Я получил аналогичное сообщение об ошибке при импорте pyzmq
в функцию Lambda, и его можно устранить путем суммирования pyzmq
пакета, созданного в среде Linux.
И, конечно, вы можете следовать инструкциям из документов AWS.
Комментарии:
1. Эта первая ссылка, которую вы включили, чрезвычайно полезна! Спасибо! Очень ценю вашу помощь
Ответ №2:
У меня была аналогичная проблема с другой библиотекой, оказалось, что зависимости, которые я установил локально, были несовместимы со средой AWS lambda. Помогло указание целевой платформы в соответствии с документацией AWS:
pip install
--platform manylinux2014_x86_64
--target=my-lambda-function
--implementation cp
--python 3.9
--only-binary=:all: --upgrade
-r requirements.txt
Взгляните на документы pip, если хотите знать, что делает каждый аргумент.