Skip to main content
 首页 » 编程设计

python之在aws lambda上运行时如何解决python中的cx_Oracle问题

2025年05月04日15Renyi-Fan

我在 aws lambda 上测试时遇到了以下错误消息。

无法导入模块“lambda_handler”:没有名为“cx_Oracle”的模块

此 lambda 由 python 代码组成,但在我的本地主机上尤其有效。

此外,我在lambda_handler.py 文件路径的同一级别执行了pip install cx_Oracle -t ./ 命令,上传的zip 文件的文件路径在其下方。

./lambda_handler.py 
 
./cx_Oracle.cp36-win_amd64.pyd 
 
./cx_Oracle-6.4.1.dist-info/* 
 
./cx_Oracle-doc/* 

我无法理解为什么 lambda_handler 只能在 lambda 函数中找不到 cx_Oracle library。

我错过了什么?

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_Oracle 库适用于 Windows。 Aws Lambda 环境是 Amazon Linux , *.pyd 是适用于 Windows 的 Python 库。

长答案: 你必须部署linux版本 您出错的第一件事是您随代码提供给 AWS Lambda 的 python 库。我猜你是在 Windows 机器上进行本地开发,所以当你这样做时:

pip install cx_Oracle -t ./ 

您将获得一个适用于 Windows 的 python 预编译库,即 cx_Oracle.cp36-win_amd64.pyd 文件。 AWS Lambdas 在 Linux 容器中运行。您可以找到有关环境的一些信息 here . Linux 的预编译库是 cx_Oracle.cpython-36m-x86_64-linux-gnu.so。您可以从 Pypi repository 手动下载它.

因此,当您在 Linux 环境中执行 python 脚本时,它会尝试在当前路径中查找库的 linux 预编译版本,即 cx_Oracle.cpython-36m-x86_64-linux-gnu.so文件。这就是您收到错误消息的原因:

Unable to import module 'lambda_handler': No module named 'cx_Oracle' 

这里第二件重要的事情是 cx_Oracle python 库调用 Oracle Instant Client这是一个本地库。如果你的 Windows 机器上有一个工作示例,你必须安装它。对于 Windows,此库采用 .dll 文件的形式。对于 linux,此 native 库采用 .so 文件的形式。 您将需要提供 适用于 Linux 的 Oracle 客户端 以及部署包中的代码,因为它们在 Amazon Linux 环境中尚不可用。

最后就是告诉Python如何找到这个动态库。在此环境变量 LD_LIBRARY_PATH 中存在的目录中查找 Linux 系统中的共享库。在 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目录是您的部署所在的位置。因此,如果您在 /var/task/lib 下添加适用于 Linux 的 Oracle 即时客户端这是 ./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