我在Ubuntu 16.04
中配置了 Oracle 11g ,其工作正常。
之前我尝试安装Oracle 12c
,这会出现一些错误,因此我将其删除并安装了11g。
现在,我的问题是当我尝试在import cx_Oracle
中使用python
时,它会为libclntsh.so.12.1
提供导入错误。
以下是整个输出:
>>> import cx_Oracle
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: libclntsh.so.12.1: cannot open shared object file: No such file or directory
我的.bashrc文件包含以下条目:
export PATH="/home/marvin/anaconda2/bin:$PATH"
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export ORACLE_SID=XE
export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
export ORACLE_BASE=/u01/app/oracle
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
为什么还要尝试Oracle 12c
? 11g配置或12c卸载中是否有错误?
我已尝试通过cx_oracle
卸载并重新安装pip
。
答案 0 :(得分:5)
在尝试加载的cx_Oracle共享库文件上运行ldd命令。你应该可以使用&#34; imp&#34;模块,用于查找正在加载的cx_Oracle模块的位置,如下所示:
import imp
imp.find_module("cx_Oracle")
你可能会发现它试图加载的模块是在你没想到的地方找到的!
此外,当您运行命令pip install cx_Oracle时,确认它实际正在编译以及正在链接的文件。
我希望其中一个提示可以帮助您弄清楚配置的问题。
答案 1 :(得分:0)
调试步骤:
1。查找要执行操作的文件
>>> import imp
>>> imp.find_module("cx_Oracle")
(<_io.BufferedReader name='/opt/data-tools/Anaconda/lib/python3.6/site-packages/cx_Oracle.cpython-36m-x86_64-linux-gnu.so'>, '/opt/data-tools/Anaconda/lib/python3.6/site-packages/cx_Oracle.cpython-36m-x86_64-linux-gnu.so', ('.cpython-36m-x86_64-linux-gnu.so', 'rb', 3))
2。做ddd
ldd /opt/data-tools/Anaconda/lib/python3.6/site-packages/cx_Oracle.cpython-36m-x86_64-linux-gnu.so
libclntsh.so.12.1 => not found
找到libclntsh.so.12.1(或您的案例缺少的任何内容)。
确保包含libclntsh.so.12.1的目录位于LD_LIBRARY_PATH中。如果它不在路径中,请添加它。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/oracle/product/12.1.0/lib/
5。卸载并安装
/opt/data-tools/Anaconda/bin/pip uninstall cx_Oracle==5.1.3
export ORACLE_HOME=/opt/oracle/product/12.1.0 && /opt/data-tools/Anaconda/bin/pip install cx_Oracle==5.1.3 --no-cache-dir
6。检查ldd
ldd /opt/data-tools/Anaconda/lib/python3.6/site-packages/cx_Oracle.cpython-36m-x86_64-linux-gnu.so
linux-vdso.so.1 => (0x00007ffd89ca2000)
libclntsh.so.12.1 => /opt/oracle/product/12.1.0/lib/libclntsh.so.12.1 (0x00007f1a3a4ba000)