使用即时客户端通过 Python3 (cx_Oracle) 连接到 Oracle 数据库时出现错误 "DPI-1047: Cannot locate a 64-bit Oracle Client library"

Error "DPI-1047: Cannot locate a 64-bit Oracle Client library" when connecting to Oracle Database with Python3 (cx_Oracle) using instant client

我正在尝试从安装了 Oracle 即时客户端 (12.2) 的 Oracle linux 7 计算机上运行的 python 脚本连接到 Oracle 数据库。 客户端安装好像没问题,我可以

export ORACLE_HOME=/u01/app/oracle/product/12.2.0.1/client
export LD_LIBRARY_PATH="${ORACLE_HOME}/bin:${LD_LIBRARY_PATH}"
$ORACLE_HOME/bin/sqlplus <username>/***@<connection_string>

并且有效。 当我在执行我的 python 脚本之前导出 ORACLE_HOME 和 LD_LIBRARY_PATH 时,脚本也能正常工作。 重点是:我想在 python 脚本中设置这些变量。我试过了

os.environ["ORACLE_HOME"] = "/u01/app/oracle/product/12.2.0.1/client"

然后

os.environ["LD_LIBRARY_PATH"] = "/u01/app/oracle/product/12.2.0.1/client/bin"

或(周围有一些 try-except-block)

os.environ["LD_LIBRARY_PATH"] = "/u01/app/oracle/product/12.2.0.1/client/bin:" + os.environ["LD_LIBRARY_PATH"]

在脚本的最开头,但我不断收到类似

的错误
DPI-1047: Cannot locate a 64-bit Oracle Client library: "libmql1.so: cannot open shared object file: No such file or directory".

我还让 python 脚本在设置数据库连接之前打印出 LD_LIBRARY 变量——它显示了正确的值。在我看来,变量的“导出”不知何故不起作用,好像 Oracle 客户端的调用没有获得正确的数据。

如果您对我可以尝试或测试的内容有任何想法,请不要犹豫,写在这里。我很乐意就该问题获得新的意见。 此致,

凯瑟琳娜

PS:是的,我知道,我不应该在没有安装真正的 Oracle 主目录的服务器上设置 ORACLE_HOME。请不要关注那个。

环境变量 LD_LIBRARY_PATH 在进程启动时检查。您不能在进程中设置该值并期望在搜索 Oracle 客户端库时检查它。

如果您不想设置 LD_LIBRARY_PATH 环境变量,您有几个选择。您可以:

  • 添加到 /etc/ld.so.conf 配置 Oracle 客户端库的位置。这将为机器的所有用户配置
  • 创建一个设置 LD_LIBRARY_PATH 的脚本,然后调用您的 Python 程序并调用该脚本而不是您的 Python 程序
  • 虽然这在技术上不受支持,但它确实有效——使用 chrpathpatchelf 将 Oracle 客户端库的 RPATH 更改为找到它的位置或值 $ORIGIN。完成后,您可以使用 cx_Oracle.init_oracle_client() 直接指定该位置