我正在尝试从安装了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。请不要专注于此。
答案 0 :(得分:1)
在进程启动时仅检查环境变量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()
直接指定该位置