【问题标题】:No module named 'psycopg2._psycopg': ModuleNotFoundError in AWS Lambda没有名为“psycopg2._psycopg”的模块:AWS Lambda 中的 ModuleNotFoundError
【发布时间】:2017-06-30 22:20:10
【问题描述】:

我使用我的 python 文件和包括 sqlalchemy 和 psycopg2 在内的依赖项为 AWS Lambda 创建了一个部署包。该代码在本地访问数据库时完美运行。但是当我导入这个 zip 文件时,我收到以下错误。

No module named 'psycopg2._psycopg': ModuleNotFoundError

错误的堆栈跟踪是,

{
  "errorMessage": "No module named 'psycopg2._psycopg'",
  "errorType": "ModuleNotFoundError",
  "stackTrace": [
    [
      "/var/task/DBAccessLamdaHandler.py",
      50,
      "lambda_handler",
      "engine = create_engine(rds_host)"
    ],
    [
      "/var/task/sqlalchemy/engine/__init__.py",
      387,
      "create_engine",
      "return strategy.create(*args, **kwargs)"
    ],
    [
      "/var/task/sqlalchemy/engine/strategies.py",
      80,
      "create",
      "dbapi = dialect_cls.dbapi(**dbapi_args)"
    ],
    [
      "/var/task/sqlalchemy/dialects/postgresql/psycopg2.py",
      554,
      "dbapi",
      "import psycopg2"
    ],
    [
      "/var/task/psycopg2/__init__.py",
      50,
      "<module>",
      "from psycopg2._psycopg import (                     # noqa"
    ]
  ]
}

任何帮助都是可观的

【问题讨论】:

  • 您不需要从头开始构建它。该存储库在 psycopg2 文件夹中包含一个预构建的包,您可以简单地将其包含在您要上传到 Lambda 的 ZIP 文件中(据称,我实际上并没有使用它)。

标签: aws-lambda psycopg2 amazon-rds


【解决方案1】:

AWS Lambda 运行时环境不包含 PostgreSQL 库,因此您需要将它们包含在您的 AWS Lambda 上传中。

一种方法是从 GitHub 的 jkehler/awslambda-psycopg2 存储库中获取它们。请注意,您不需要从头开始构建此项目,因为存储库在 psycopg2 folder 中包含一个预构建的包,您可以简单地将其包含在您的 Lambda 上传中。

【讨论】:

  • 这有帮助。谢谢
  • 此解决方案如何与从 requirmets.txt 文件安装包的无服务器框架一起使用?
  • 我已经像这样包含了这个库,但是它仍然无法正常工作。我出了什么问题?
  • 对于任何使用 CloudFormation + CodeBuild 的人来说,buildspec.yml 中的以下两行就像一个魅力:- git clone https://github.com/a-j/awslambda-psycopg2.git &amp;&amp; cd awslambda-psycopg2 &amp;&amp; git checkout python-3.8-libraries- cp -r awslambda-psycopg2/psycopg2-3.8 ./src &amp;&amp; mv ./src/psycopg2-3.8 ./src/psycopg2
【解决方案2】:

jkehler/awslambda-psycopg2 的 psycopg2 构建库是为 python 3.6 构建的,并确保在将代码上传到 AWS lambda 时,选择 Python Runtime environment 作为 3.6,它应该可以工作。我为此头疼了一整天,然后当我更改为 3.6 时,导入错误就消失了。

如果您要尝试自己构建它,remember that you must build on a machine or VM with the same architecture as your target at AWS

【讨论】:

  • 谢谢 Nikhil,但我试过了,但它在 p3.6 上不起作用,你能详细帮忙吗?
  • @ganeshdeshmukh 它在 python 3.7 上与我一起工作。我只是复制了 python 3.7 的整个文件夹,将其重命名为 psycopg2,然后使用我的 lambda 函数文件对其进行压缩。将压缩文件上传到 aws lambda 后,它按预期工作。我想python 3.6的过程应该是类似的。
  • 它在 python 3.6 上与我一起工作。我遵循了@FanchenBao 提到的相同程序
【解决方案3】:

截至 2020 年 3 月 26 日的最新版本

我对依赖第三方库来编写生产代码持怀疑态度。在研究以下工作时,

仅当包是从 MAC OS 构建时才会出现此问题。

我今天可以确认,当我从 Centos 7 (AWS AMI) 构建软件包时问题已得到解决

以下是我的做法

requirement.txt

psycopg2-binary==2.8.4

构建过程

pip install -r requirements.txt --target .

Lambda 代码在根目录中

+-- lambda_function.py
+-- psycopg2
    +-- psycopg2 files

压缩目录并在 lambda 中测试代码是否有效。

唯一的额外步骤是使用 Docker 容器在 Linux 环境而不是 macOS 中构建包。一个例子可以在这里找到:Deploy AWS Amplify Python Lambda from macOS with Docker

【讨论】:

  • 这与 AWS Lambda 运行时有何关系?软件包由pipaws/codebuild/standard:2.0 映像上安装
  • Python 运行时首先检查本地库。试一试 - 直到现在都在生产中为我工作
【解决方案4】:

对于 Windows(看起来像在任何不是基于 Amazon AMI 或 Centos 构建的操作系统中),最简单的修复方法是使用

适用于 AWS Lambda 的 psycopg2 Python 库

你可以找到https://github.com/jkehler/awslambda-psycopg2

【讨论】:

    【解决方案5】:

    不要使用 psycopg2,而是尝试使用 pg8000 在命令提示符中转到您当前工作的目录(例如 F:\example) 点安装 pg8000 -t。 (-t. 用于在您正在工作的目录中安装 pg8000)

    // handler.py 导入pg8000

    database=''
    host=''
    port=''
    user=''
    password=''
    conn = pg8000.connect(database=database, host=host, port=port, user=user, 
    password=password)
    
    def lambda_function(event, context):
       .
       .
       .
    

    编写代码后,将代码压缩并上传到您的 aws lambda。

    它对我有用!!!

    【讨论】:

      【解决方案6】:

      与其他答案一样,psycopg2-binary 在 python3.9 上运行良好(看起来其他包 awslambda-psycopg2 仅适用于 python3.6)。

      但是,如果您在发送到 aws lambda 之前在 MacOs 上运行,您必须像这样为您的 pip 安装指定平台:

      pip3.9 install --platform=manylinux1_x86_64 --only-binary=:all: psycopg2-binary
      

      【讨论】:

        【解决方案7】:

        尽管我尝试了多个 psycopg2 版本,但让 SQLAlchemy 在 AWS Lambda 上运行时遇到问题,但最终为我解决的问题是使用较旧的 Python 版本。我从 Python 3.9 转到 3.7,它终于能够运行(使用 psycopg2-binary 2.8.4,但我没有尝试其他版本或 3.7 的非二进制版本)

        【讨论】:

          【解决方案8】:

          psycopg 的最新更新(当我回答这个问题时)修复了这个问题。您需要将 psycopg2-binary 的版本更新为 2.8.4。这对我有用。

          psycopg2-binary==2.8.4
          

          【讨论】:

          • 不幸的是,这对我不起作用。它仍然给我与 OP 相同的错误消息。
          • 我也没有,您是否需要更改代码中的任何内容?
          • 即使在安装 psycopg2-binary==2.8.4 之后仍然面临同样的错误。有任何其他方法可以解决这个问题吗?
          最近更新 更多