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.