AWS Glue Python Shell 与 Oracle cx_Oracle 的连接问题

Nou*_*lid 3 python oracle amazon-web-services aws-glue

我正在研究 AWS Glue Python Shell。我想将 python shell 与 Oracle 连接。我成功安装了 psycopg2 和 mysql 库,但是当我尝试使用 cx_Oracle 连接 Oracle 时,我已成功安装该库,但遇到错误

数据库错误:DPI-1047:无法找到 64 位 Oracle 客户端库:“libclntsh.so:无法打开共享对象文件:没有这样的文件或目录”

我尝试过以下事情

  1. 我已经so从 S3 下载了文件并将其与代码文件并行放置在 lib 文件夹中

  2. 我已经使用 os.environ 设置了 LD_LIBRARY_PATH、ORACLE_HOME

我正在使用以下代码

import boto3
import os
import sys
import site
from setuptools.command import easy_install

s3 = boto3.client('s3')
dir_path = os.path.dirname(os.path.realpath(__file__))
#os.path.dirname(sys.modules['__main__'].__file__)

install_path = os.environ['GLUE_INSTALLATION']
easy_install.main( ["--install-dir", install_path, "cx_Oracle"] )

importlib.reload(site)

import cx_Oracle

conn_str = u'{username}/{password}@{host}:{port}/{sid}'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u'select * from hr.countries')
for row in c:
    print(row[0], "-", row[1])
conn.close()
print('hello I am here');
Run Code Online (Sandbox Code Playgroud)

我应该能够在 awsglue python shell 上与 oracle 连接

小智 5

正如在回复中已经提到的那样。LD_LIBRARY_PATH需要在脚本启动之前设置。因此,避免使用的一种方法LD_LIBRARY_PATHrpathso文件中进行设置。以下是所需的步骤。

您将需要更新rpath您的so文件。这可以使用包来完成patchelf

还请将您的文件包含libaio.so.1so您可能通过运行生成的文件中sudo apt-get install libaio1

安装中patchelf

sudo apt-get update sudo apt-get install patchelf

更新rpath到您的 lib 目录

patchelf --set-rpath <absolute_path_to_library_dir> libclntsh.so

so将更新后的文件上传rpath到您的glue env lib目录。

然后您可以在脚本中加载该库。

from ctypes import *
cdll.LoadLibrary('<absolute_path_to_library_dir>/libclntsh.so')
Run Code Online (Sandbox Code Playgroud)