使用即时客户端通过Python3(cx_Oracle)连接到Oracle数据库时,错误“ DPI-1047:无法找到64位Oracle客户端库”

时间:2020-09-03 16:11:41

标签: python oracle cx-oracle

我正在尝试从安装了Oracle Instant Client(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客户端的调用没有获得正确的数据。

如果您有任何想法我可以尝试或测试,请立即在此处写下。我很高兴收到有关该问题的新意见。 问候

Katharina

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

1 个答案:

答案 0 :(得分:1)

在进程启动时仅检查环境变量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()直接指定该位置