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

时间:2017-06-30 22:20:10

标签: aws-lambda psycopg2 amazon-rds

我已经使用我的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"
    ]
  ]
}

任何帮助都很明显

6 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

psycopg2-binary==2.8.4

答案 3 :(得分:0)

截至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作品中的代码。

唯一的附加步骤是在Linux env而不是MAC OS中构建软件包

答案 4 :(得分:0)

对于Windows(就像在非基于Amazon AMI或Centos的任何操作系统中一样),最简单的修复方法是使用

适用于AWS Lambda的psycopg2 Python库

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

答案 5 :(得分:0)

代替使用psycopg2,请尝试使用pg8000 在命令提示符下转到您当前正在使用的目录(示例F:\ example) pip安装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中。

对我有用!