在aws lambda上运行时,如何在python中解决cx_Oracle问题
我在aws lambda上测试时遇到以下错误消息在aws lambda上运行时,如何在python中解决cx_Oracle问题,python,amazon-web-services,aws-lambda,cx-oracle,Python,Amazon Web Services,Aws Lambda,Cx Oracle,我在aws lambda上测试时遇到以下错误消息 无法导入模块“lambda\u处理程序”:没有名为“cx\u Oracle”的模块 这个lambda由python代码组成,但在我的本地主机上尤其有效 另外,我在同一级别的lambda\u handler.py文件路径上执行了pip install cx\u Oracle-t./命令,上传的zip文件的文件路径位于该路径下方 ./lambda_handler.py ./cx_Oracle.cp36-win_amd64.pyd ./cx_Ora
无法导入模块“lambda\u处理程序”:没有名为“cx\u Oracle”的模块
这个lambda由python代码组成,但在我的本地主机上尤其有效
另外,我在同一级别的lambda\u handler.py文件路径上执行了pip install cx\u Oracle-t./
命令,上传的zip文件的文件路径位于该路径下方
./lambda_handler.py
./cx_Oracle.cp36-win_amd64.pyd
./cx_Oracle-6.4.1.dist-info/*
./cx_Oracle-doc/*
我不明白为什么lambda_处理程序无法在仅lambda函数中找到cx_Oracle库
我错过了什么
import cx_Oracle
import boto3
from docutils.nodes import row
def lambda_handler(event, context):
url = 'myOracleUrl'
user = 'myOralceUserId'
pwd = 'myOraclePwd'
con = cx_Oracle.connect(user + '/' + pwd + '@' + url)
cur = con.cursor()
cur.execute("select 1 from dual")
cur.close()
con.close()
return {
"statusCode": 200,
"body": context.invoked_function_arn
}
cx\U Oracle
不仅需要pip安装
,还需要本机Oracle客户端,而控制盘依赖于本机Oracle客户端。Lambda函数在EC2上运行,本机库的选择有限。值得一提的是,几乎任何RDBMS都会遇到同样的问题—PostgreSQL、MySQL等
有关更多信息,请参阅本文:
请注意,它适用于基于Chalice的部署,但基本要求是相同的。
cx\u Oracle
不仅需要pip安装
,还需要本机Oracle客户端,而控制盘依赖于本机Oracle客户端。Lambda函数在EC2上运行,本机库的选择有限。值得一提的是,几乎任何RDBMS都会遇到同样的问题—PostgreSQL、MySQL等
有关更多信息,请参阅本文:
请注意,它是用于基于Chalice的部署的,但基本要求是相同的。我们遇到了这个问题,然后我们不得不将数据访问函数实现到AWS Lambda Java 8而不是Python 3.6中 在Java 8中,ojdbc*.jar(*-->Oracle驱动程序的版本号)可以简单地捆绑到最终的zip中,并且没有其他步骤像尝试获取Oracle客户端本机库那样
我们确实花了大量时间让AWS Lambda Python函数访问Oracle DB,但我觉得在AWS Lambda Java 8函数中开发此类模块要简单得多。我们遇到了这个确切的问题,然后我们不得不将数据访问函数实现到AWS Lambda Java 8而不是Python 3.6中 在Java 8中,ojdbc*.jar(*-->Oracle驱动程序的版本号)可以简单地捆绑到最终的zip中,并且没有其他步骤像尝试获取Oracle客户端本机库那样
我们确实花了大量时间让AWS Lambda Python函数访问Oracle DB,但我觉得在AWS Lambda Java 8函数中开发此类模块要简单得多。简短回答:
您正在使用的cx\U Oracle库是用于Windows的。Aws Lambda环境是,*.pyd是用于Windows的Python库 长答案: 您必须部署linux版本 第一件出错的事情是在代码中提供给AWS Lambda的python库。我猜您是在Windows计算机上本地开发的,因此当您这样做时:
pip install cx_Oracle -t ./
您将获得一个用于Windows的python预编译库,它是cx_Oracle.cp36-win_amd64.pyd文件。
AWS lambda在Linux容器中运行。你可以找到一些关于环境的信息。
Linux的预编译库是cx\u Oracle.cpython-36m-x86\u 64-Linux-gnu.so。您可以从中手动下载
因此,当您在Linux环境中执行python脚本时,它将尝试在当前路径中查找库的Linux预编译版本,cx\u Oracle.cpython-36m-x86\u 64-Linux-gnu.So文件。这就是您收到错误消息的原因:
Unable to import module 'lambda_handler': No module named 'cx_Oracle'
这里第二件重要的事情是,cx_Oracle python库调用本机库。如果您的windows计算机上有工作示例,则必须安装此示例。对于windows,此库的格式为.dll文件。对于linux,本机库的格式为.so文件。
您需要在部署包中提供Oracle client for Linux以及代码,因为在Amazon Linux环境中尚未提供
最后一件事是告诉Python如何找到这个动态库。在Linux系统中,在该环境变量LD\u LIBRARY\u PATH中的目录中查找共享库。在Amazon Linux中,此变量包含:
LD_LIBRARY_PATH:/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib
部署所在的目录是/var/task
。因此,如果您将Oracle instant client for Linux添加到开发目录中的/var/task/lib
下,即/lib
,您就完成了
您的部署包应与此类似:
├── lib
│ ├── libclntsh.so <-- Oracle instant client linux files
│ .
│ .
│ .
├── python_handler.py <-- Lambda function code
└── cx_Oracle.cpython-36m-x86_64-linux-gnu.so <-- cx_Oracle library
├── 解放党
│ ├── libclntsh.so简短回答:
您正在使用的cx\U Oracle库是用于Windows的。Aws Lambda环境是,*.pyd是用于Windows的Python库
长答案:
您必须部署linux版本
第一件出错的事情是在代码中提供给AWS Lambda的python库。我猜您是在Windows计算机上本地开发的,因此当您这样做时:
pip install cx_Oracle -t ./
您将获得一个用于Windows的python预编译库,它是cx_Oracle.cp36-win_amd64.pyd文件。
AWS lambda在Linux容器中运行。你可以找到一些关于环境的信息。
Linux的预编译库是cx\u Oracle.cpython-36m-x86\u 64-Linux-gnu.so。您可以从中手动下载
因此,当您在Linux环境中执行python脚本时,它将尝试在当前路径中查找库的Linux预编译版本,cx\u Oracle.cpython-36m-x86\u 64-Linux-gnu.So文件。这就是您收到错误消息的原因:
Unable to import module 'lambda_handler': No module named 'cx_Oracle'
这里第二件重要的事情是,cx_Oracle python库调用本机库。如果您的windows计算机上有工作示例,则必须安装此示例。对于windows,此库位于