cx_Oracle 无法识别要在 Linux 上安装的 Oracle 软件安装位置

cx_Oracle does not recognize location of Oracle software installation for installation on Linux

我已经能够在我的 Windows 8 笔记本电脑上成功安装 cx_Oracle 以与 Python 3.4 一起使用,我现在正在尝试获得相同的设置(cx_Oracle 和 Python 3.4) 到 Linux 机器上。当 运行 从 cx_Oracle-5.1.3.tar.gz 中调用 setup.py 文件时,我得到了这个错误:

    sudo python3 setup.py install
    Traceback (most recent call last):
       File "setup.py", line 135, in <module>
          raise DistutilsSetupError("cannot locate an Oracle software " \
    distutils.errors.DistutilsSetupError: cannot locate an Oracle software installation

根据我查看的一些其他答案 (easy_install cx_Oracle (python package) on Windows, https://gist.github.com/jarshwah/3863378),我已经安装了这 3 个即时客户端 rpm:

rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.i386.rpm
rpm -ivh oracle-instantclient12.1-devel-12.1.0.2.0-1.i386.rpm
rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.i386.rpm

然后我将 ORACLE_HOME 设置为它们安装到的文件夹,这应该有助于 python 识别 oracle 文件的位置,以便它可以正确地进行安装。

每次尝试 运行 setup.py 文件时,我仍然会遇到相同的 "cannot locate an Oracle software installation" 错误。

知道我需要做什么才能成功安装 cx_oracle 吗?

更多信息更新:

echo $ORACLE_HOME returns /instantclient_12_1,rpm 文件安装到的地方。

这是我的 /instantclient_12_1 目录的内容:

adrci                  libnnz12.so       libsqlplusic.so  tnsnames.ora
BASIC_README           libocci.so        libsqlplus.so    tnsnames.ora_andy
genezi                 libocci.so.12.1   ojdbc6.jar       uidrvci
glogin.sql             libociei.so       ojdbc7.jar       xstreams.jar
libclntshcore.so.12.1  libocijdbc12.so   sdk
libclntsh.so           libons.so         sqlplus
libclntsh.so.12.1      liboramysql12.so  SQLPLUS_README

这与我的 Windows 8 安装目录有点不同——那个目录有 .dll.sym 文件,例如 orasql12.dll。 Linux 版本的即时客户端安装是否应该有不同的文件?

更新部分解决方案:

我找到了一个正确安装 cx_Oracle 的解决方案,但仅在那个 shell 实例期间:

我设置了这两个环境变量:

export ORACLE_HOME=/instantclient_12_1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME

然后我创建了一个 Symbolic link:

ln -s libclntsh.so.12.1 libclntsh.so

之后,转到 cx_oracle 文件夹并执行此操作:

python3 setup.py build
python3 setup.py install

出于某种原因,sudo python3 setup.py install 对此不起作用。

更新 link 相关问题:

我的下一个问题是让环境变量在 shell 实例之外持续存在,这样我就不必每次都定义环境变量。我在 profile.d 中输入的环境变量在我 echo 时显示出来,但是 python 无法正确导入 cx_oracle ,出于某种原因我不得不再次导出环境变量。我不知道发布与一个问题相关的不同问题的正确程序,所以我在这里开了一个新问题:

请帮我解决这个问题,我觉得完全无法尝试让它发挥作用。当我回显它们时,环境变量会显示出来,但只有在 运行 执行 python 代码之前再次导出它们时,它们才会起作用。

已更新

一样,在构建时设置LD_RUN_PATH 将在安装期间构建的cx_Oracle 共享库中包含Oracle 共享库文件的路径。正如我在第一个答案中建议的那样,这消除了 LD_LIBRARY_PATH 的需要。


对于您使用的 RPM,ORACLE_HOME 应设置为 /usr/lib/oracle/12.1/client。如果您使用 pip:

$ export ORACLE_HOME=/usr/lib/oracle/12.1/client
$ export LD_RUN_PATH=/usr/lib/oracle/12.1/client/lib:$LD_RUN_PATH
$ pip install cx_Oracle
$ python -c 'import cx_Oracle; print(cx_Oracle.version)'
5.1.3

阅读此 documentation 了解有关安装和执行使用客户端库的应用程序的一些信息。

当我尝试在 Ubuntu 16.04 和 python 2.7.12 和 Oracle 客户端 12.1.0.2 中单独安装 cx_Oracle 和 LD_LIBRARY_PATH 变量时 pip 安装失败,正在寻找对于 Oracle 12.1.0.2 客户端不再可用的头文件。它适用于 LD_RUN_PATH