使用即时客户端通过 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 程序
- 虽然这在技术上不受支持,但它确实有效——使用
chrpath
或 patchelf
将 Oracle 客户端库的 RPATH
更改为找到它的位置或值 $ORIGIN
。完成后,您可以使用 cx_Oracle.init_oracle_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 程序 - 虽然这在技术上不受支持,但它确实有效——使用
chrpath
或patchelf
将 Oracle 客户端库的RPATH
更改为找到它的位置或值$ORIGIN
。完成后,您可以使用cx_Oracle.init_oracle_client()
直接指定该位置