我正在尝试将Python3.5(Mac OS X El Capitan)连接到Oracle集群(远程)。
对于安装cx_Oracle,我设置了:
export ORACLE_HOME=/Applications/oracle/instantclient_11_2
export LD_LIBRARY_PATH=$ORACLE_HOME
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH
现在我得到错误:
**Unable to acquire Oracle environment handle**
我不知道为什么会这样。有任何想法吗?
我什至创建文件tnsnames.ora并将其放入/Applications/oracle/instantclient_11_2/network/admin/tnsnames.ora
orcl=
(description=
(address_list=
(address = (protocol = TCP)(host = xxx.xxx.xxx.xxx)(port = 1521))
)
(connect_data =
(service_name=oratst)
)
)
我的python代码:
import traceback
import os
os.environ["ORACLE_HOME"] = "/Applications/oracle/instantclient_11_2"
os.environ["LD_LIBRARY_PATH"] = "/Applications/oracle/instantclient_11_2"
os.environ["DYLD_LIBRARY_PATH"] = "/Applications/oracle/instantclient_11_2"
os.environ["LD_LIBRARY_PATH"] = "/Applications/oracle/instantclient_11_2"
import cx_Oracle
try:
connection = cx_Oracle.Connection('user', 'password', cx_Oracle.makedsn('remote_ip', 1521, 'sid'))
except Exception as e:
print(type(e))
print(e)
traceback.print_tb(e.__traceback__)
PS cx_Oracle-是非常奇怪的模块。尝试访问以下目录中的库:
/ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
/ade/dosulliv_ldapmac/oracle/ldap/lib/libnnz11.dylib
我从来没有这个路径,但创建了符号链接。
解决方案
ln -s libclntsh.dylib.11.1 libclntsh.dylib
mkdir ~/lib
ln -s /wherever/instantclient_11_2/{libclntsh.dylib.11.1,libnnz11.dylib,libociei.dylib} ~/lib/
El Capitan破坏了DYLD_LIBRARY_PATH,所以没有意义设置它:(也没有意义设置Linux LD_LIBRARY_PATH变量。
如果创建tnsnames.ora文件,请将TNS_ADMIN设置为该目录所在的目录。不要在运行Instant Client的过程中设置ORACLE_HOME(尽管您可能需要在cx_Oracle安装过程中对其进行临时设置。请将其设置为将Instant Client basic解压缩的目录) &sdk到,例如/ Applications / oracle / instantclient_11_2)