AWS Lambda 中没有名为 'psycopg2._psycopg' 的模块:ModuleNotFoundError
No module named 'psycopg2._psycopg': ModuleNotFoundError in AWS Lambda
我已经使用我的 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"
]
]
}
任何帮助都是可观的
AWS Lambda 运行时环境不包含 PostgreSQL 库,因此您需要将它们包含在您的 AWS Lambda 上传中。
执行此操作的一种方法是从 jkehler/awslambda-psycopg2 repo at GitHub. Note that you don't need to build this project from scratch as the repo includes a pre-built package in the psycopg2 folder 中获取它们,您可以简单地将其包含在您的 Lambda 上传中。
来自 jkehler/awslambda-psycopg2 的 psycopg2 构建库是为 python 3.6 构建的,并确保在将代码上传到 AWS lambda 时,select Python 运行时环境为 3.6 ,它应该可以工作。我为此苦苦思索了一整天,然后当我更改为 3.6 时,导入错误就消失了。
如果您打算自己构建它,remember that you must build on a machine or VM with the same architecture as your target at AWS。
psycopg 的最新更新(当我回答这个问题时)修复了这个问题。您需要将 psycopg2-binary 的版本更新到 2.8.4。这对我有用。
psycopg2-binary==2.8.4
26 日最新/MAR/2020
我对依赖第三方库作为我的生产代码持怀疑态度。研究以下作品,
仅当包是从 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 works 中测试代码。
唯一的额外步骤是使用 Docker 容器在 Linux env 而不是 macOS 中构建包。可以在此处找到示例:Deploy AWS Amplify Python Lambda from macOS with Docker
对于 Windows(在任何 OS 中看起来都不是在 Amazon AMI 或 Centos 上构建的),最简单的解决方法是使用
psycopg2 Python AWS Lambda 库
不使用 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 中。
对我有用!!!
与其他答案一样,psycopg2-binary 在 python3.9 上运行良好(看起来其他包 awslambda-psycopg2
仅适用于 python3.6)。
但是,如果您在发送到 aws lambda 之前在 MacOs 上 运行,则必须像这样为您的 pip 安装指定平台:
pip3.9 install --platform=manylinux1_x86_64 --only-binary=:all: psycopg2-binary
尽管我尝试了多个 psycopg2 版本,但我在 AWS Lambda 上让 SQLAlchemy 到 运行 时遇到了问题,但最终为我解决的是使用旧的 Python 版本.我从 Python 3.9 到 3.7,它终于可以 运行 (使用 psycopg2-binary 2.8.4,但我没有尝试其他版本或 none 二进制版本与 3.7 )
感谢AWS Lambda Layers we can include a ready compiled psycopg2 layer for our selected Python versions directly to our Lambda function. Please use the version you need from this Github repo。在 Lambda 和层创建中小心使用正确的 Python 版本和区域。
我已经使用我的 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"
]
]
}
任何帮助都是可观的
AWS Lambda 运行时环境不包含 PostgreSQL 库,因此您需要将它们包含在您的 AWS Lambda 上传中。
执行此操作的一种方法是从 jkehler/awslambda-psycopg2 repo at GitHub. Note that you don't need to build this project from scratch as the repo includes a pre-built package in the psycopg2 folder 中获取它们,您可以简单地将其包含在您的 Lambda 上传中。
来自 jkehler/awslambda-psycopg2 的 psycopg2 构建库是为 python 3.6 构建的,并确保在将代码上传到 AWS lambda 时,select Python 运行时环境为 3.6 ,它应该可以工作。我为此苦苦思索了一整天,然后当我更改为 3.6 时,导入错误就消失了。
如果您打算自己构建它,remember that you must build on a machine or VM with the same architecture as your target at AWS。
psycopg 的最新更新(当我回答这个问题时)修复了这个问题。您需要将 psycopg2-binary 的版本更新到 2.8.4。这对我有用。
psycopg2-binary==2.8.4
26 日最新/MAR/2020
我对依赖第三方库作为我的生产代码持怀疑态度。研究以下作品,
仅当包是从 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 works 中测试代码。
唯一的额外步骤是使用 Docker 容器在 Linux env 而不是 macOS 中构建包。可以在此处找到示例:Deploy AWS Amplify Python Lambda from macOS with Docker
对于 Windows(在任何 OS 中看起来都不是在 Amazon AMI 或 Centos 上构建的),最简单的解决方法是使用
psycopg2 Python AWS Lambda 库
不使用 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 中。
对我有用!!!
与其他答案一样,psycopg2-binary 在 python3.9 上运行良好(看起来其他包 awslambda-psycopg2
仅适用于 python3.6)。
但是,如果您在发送到 aws lambda 之前在 MacOs 上 运行,则必须像这样为您的 pip 安装指定平台:
pip3.9 install --platform=manylinux1_x86_64 --only-binary=:all: psycopg2-binary
尽管我尝试了多个 psycopg2 版本,但我在 AWS Lambda 上让 SQLAlchemy 到 运行 时遇到了问题,但最终为我解决的是使用旧的 Python 版本.我从 Python 3.9 到 3.7,它终于可以 运行 (使用 psycopg2-binary 2.8.4,但我没有尝试其他版本或 none 二进制版本与 3.7 )
感谢AWS Lambda Layers we can include a ready compiled psycopg2 layer for our selected Python versions directly to our Lambda function. Please use the version you need from this Github repo。在 Lambda 和层创建中小心使用正确的 Python 版本和区域。