Ошибка при попытке импортировать pysftp в Lambda: не удается импортировать имя ‘_bcrypt’ из частично инициализированного модуля ‘bcrypt’ (скорее всего, из-за циклического импорта)

#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, если хотите знать, что делает каждый аргумент.