尝试在Lambda中导入pysftp时出错:无法从部分初始化的模块“ bcrypt”中导入名称“ _bcrypt”很可能是由于循环导入

问题描述

我正在尝试在我的AWS lambda函数中导入pysftp,但出现此错误: “无法导入模块'app':无法从部分初始化的模块'bcrypt'导入名称'_bcrypt'(很可能是由于循环导入)”

我在函数中编写的唯一代码是基本的代码以及pysftp import:

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'的模块”。所以至少我不再收到该错误

我还尝试将所有软件包和lambda函数一起压缩到一个文件夹中,然后将该压缩文件夹直接上传到我的lambda函数中(如该视频:https://www.youtube.com/watch?v=yyBSeGkuPqk所示),但是我得到的却是相同的错误。使用layer方法要简单得多,所以我宁愿坚持。

当我尝试研究特定的错误时,我真正能找到的只是那些以错误的顺序列出了自己的进口商品或多次进口包裹的人。但是我什么都不做。我只是想让简单的代码正常工作。

非常感谢您的帮助!谢谢!

解决方法

似乎 bcrypt 需要 C 或 C++ 库。该问题可能与 this 有关。我在 Lambda 函数中导入 pyzmq 时收到了类似的错误消息,可以通过在 Linux 环境中构建一个 pyzmq 包来解决该问题。

当然,您可以按照 AWS docs 中的说明进行操作。