Skip to content
Advertisement

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

I have been able to successfully install cx_Oracle for use with Python 3.4 on my Windows 8 laptop, and I am now trying to get the same setup (cx_Oracle with Python 3.4) onto a Linux machine. When running the setup.py file from cx_Oracle-5.1.3.tar.gz, I end up with this error:

    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

Following some other answers I looked at (easy_install cx_Oracle (python package) on Windows, https://gist.github.com/jarshwah/3863378) I have installed these 3 instant client rpms:

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

And then I set ORACLE_HOME to the folder that they were installed to, which is supposed to help python identify the location of the oracle files so it can do the installation properly.

I still get the same “cannot locate an Oracle software installation” error each time I try to run the setup.py file.

Any idea what I need to do to be able to successfully install cx_oracle?

Update for more info:

echo $ORACLE_HOME returns /instantclient_12_1, which is where the rpm files installed to.

This is the contents of my /instantclient_12_1 directory:

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

This is a bit different from the directory I have for my Windows 8 install – that one has .dll and .sym files, like orasql12.dll. Should the Linux version of the instant client install have different files?

Update with partial solution:

I found a solution that installed cx_Oracle properly, but only during that shell instance:

I set these two environment variables:

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

And then I created a Symbolic link:

ln -s libclntsh.so.12.1 libclntsh.so

After that, going to the cx_oracle folder and doing this worked:

python3 setup.py build
python3 setup.py install

For some reason, sudo python3 setup.py install did not work for this.

Update with link to related question:

My next problem is getting the environment variables to persist outside of the shell instance so I don’t have to define the environment variables each time. The environment variables I put in profile.d show up when I echo them, but python fails to import cx_oracle properly, and I have to export the environment variables again for some reason. I don’t know the proper procedure for posting a different question related to one, so I opened a new question here:

Linux profile.d environment variables don’t work with cx_oracle in Python

Please help me out with this, I feel completely stuck on what to try to make it work. The environment variables show up when I echo them, but they only seem to be functional if I export them again before running the python code.

Advertisement

Answer

Updated

As Petriborg suggested, setting LD_RUN_PATH at build time will include the path to the Oracle shared library files in the cx_Oracle shared library that is built during installation. This obviates the need for LD_LIBRARY_PATH as I suggested in my first answer.


For the RPMs that you are using, ORACLE_HOME should be set to /usr/lib/oracle/12.1/client. If you are using 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

Read this documentation for some info on installing and executing applications that use the client libraries.

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement