没有名为“ psycopg2._psycopg”的模块:AWS Lambda中的ModuleNotFoundError

Kat*_*jan 5 psycopg2 amazon-rds aws-lambda

我已经使用我的python文件以及包括sqlalchemy和psycopg2在内的依赖项为AWS Lambda创建了一个部署程序包。该代码可以完美地在本地访问数据库。但是,当我导入此zip文件时,出现以下错误。

No module named 'psycopg2._psycopg': ModuleNotFoundError
Run Code Online (Sandbox Code Playgroud)

错误的堆栈跟踪为

{
  "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"
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

任何帮助都是可观的

Nik*_*ran 13

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

如果您打算尝试自己构建它,请记住,您必须在与 AWS 目标具有相同架构的机器或 VM 上构建


Vin*_*t J 11

与其他答案一样,psycopg2-binary 对于 python3.9 工作得很好(看起来其他包awslambda-psycopg2仅适用于 python3.6)。

但是,如果您在发送到 aws lambda 之前在 MacO 上运行,则必须为 pip 安装指定平台,如下所示:

pip3.9 install --platform=manylinux1_x86_64 --only-binary=:all: psycopg2-binary
Run Code Online (Sandbox Code Playgroud)


jar*_*mod 9

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

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

  • 此解决方案如何与从 requiremets.txt 文件安装包的无服务器框架配合使用? (2认同)
  • 我已经像这样包含了这个库,但是它仍然无法正常工作。我出了什么问题? (2认同)
  • 对于任何使用 CloudFormation + CodeBuild 的人来说,`buildspec.yml` 中的以下两行就像一个魅力:`- git clone https://github.com/aj/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认同)

vir*_*iru 8

最新截至 2020 年 3 月 26 日

我对依赖第三方库来获取我的生产代码持怀疑态度。研究了以下工作,

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

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

以下是我的做法

需求.txt

psycopg2-binary==2.8.4
Run Code Online (Sandbox Code Playgroud)

构建过程

psycopg2-binary==2.8.4
Run Code Online (Sandbox Code Playgroud)

Lambda代码位于根目录中

+-- lambda_function.py
+-- psycopg2
    +-- psycopg2 files
Run Code Online (Sandbox Code Playgroud)

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

唯一的额外步骤是使用 Docker 容器在 Linux 环境(而不是 macOS)中构建包。可以在此处找到示例:使用 Docker 从 macOS 部署 AWS Amplify Python Lambda

  • Python 运行时首先检查本地库。试一试 - 迄今为止在生产中对我有用 (2认同)

小智 6

psycopg2 python 包需要 Postgres 库,而 AWS Lambda 函数使用的 AMI 中缺少该库。

最简单的解决方案是使用具有所需库的预编译包 aws-psycopg2。该包存在于 PyPi 存储库中。

pip 安装 aws-psycopg2

之后,只需在程序中照常导入 psycopg2 即可。下面给出了导入示例。

import psycopg2 有了这个包,我的 Lambda 函数开始完美运行。