【问题标题】:Error "DPI-1047: Cannot locate a 64-bit Oracle Client library" when connecting to Oracle Database with Python3 (cx_Oracle) using instant client使用即时客户端通过 Python3 (cx_Oracle) 连接到 Oracle 数据库时出现错误“DPI-1047:找不到 64 位 Oracle 客户端库”
【发布时间】:2020-09-03 16:11:41
【问题描述】:

我正在尝试从在安装了 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。请不要专注于此。

【问题讨论】:

  • thisthis 是否回答您的问题..?
  • 从安装路径看来,您有一个“完整”客户端,因此需要设置 ORACLE_HOME,因为它会被引用来查找消息文件等数据文件。只有拥有 Oracle Instant Client 才不会设置 ORACLE_HOME。
  • 我自己设置了安装路径,这样无论是数据库服务器还是客户端,我都可以使用相同的路径。

标签: python oracle cx-oracle


【解决方案1】:

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

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

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

【讨论】:

  • 我试过chrpath -l /u01/app/oracle/product/12.2.0.1/client/bin/sqlplus,但它显示no rpath or runpath tag found.。 “更改 Oracle 客户端库的 RPATH”到底是什么意思?
  • 您要更改 $ORACLE_HOME/lib/libclntsh.so 的 rpath,而不是 SQL*Plus 的 rpath!
  • 我尝试了patchelf,但效果很好。非常感谢你!如果您将patchelf 添加到您的答案中,我会将您的答案标记为“已解决的问题”。
  • 是的,patchelf 是另一种解决方案,我已按照建议将其添加到答案中。谢谢!
猜你喜欢
  • 2020-11-23
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 2022-11-07
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多