ImportError: libclntsh.so.10.1: cannot open shared object file: Permission denied

Damjan gdamjan at gmail.com
Tue Aug 8 19:27:48 EDT 2006


> I have a similar question (importing cx_Oracle, but not related to
> cron).  I would like to use solution #2 below and it does not work.  If
> I set LD_LIBRARY_PATH before running python, it works.  If I try to set
> it via os.environ, it does not work.
> 
> I have tried this in an interactive Python shell.  I can print the
> value of os.environ["LD_LIBRARY_PATH"] and it is correct, but the
> import fails.  The cx_Oracle.so file is found, but when it tries to
> load the necessary Oracle library (libclntsh.so.9.0), I get the
> message:
> 
>   ImportError: libclntsh.so.9.0: cannot open shared object file: No
> such file or directory
> 
> Is there something else I have to do when changing os.environ before
> trying the import?

Well, all the oracle stuff is installed in /usr/lib/oracle  on my computers
(or /usr/share/oracle ... depends when and how I installed it), 
but I also always make the symbolic links in /usr/lib too.

I guess once Python is started (and the C level library loader) you can't
change LD_LIBRARY_PATH anymore.

What I ussually set in os.environ is ORACLE_HOME because the oracle library
still needs to find some additional files too.


BTW cx_Oracle seems to only need  /usr/lib/libnnz10.so
and /usr/lib/libclntsh.so.10.1 but I also have these links in /usr/lib:
 libclntsh.so -> oracle/lib/libclntsh.so* 
       (this is a link to the .so.10.1 file)
 libclntsh.so.10.1 -> oracle/lib/libclntsh.so.10.1*
 libnnz10.so -> oracle/lib/libnnz10.so*
 libocci.so -> oracle/lib/libocci.so* 
       (this is a links to the .so.10.1 file
 libocci.so.10.1 -> oracle/lib/libocci.so.10.1*
 libociei.so -> oracle/lib/libociei.so*

This is with oracle instant client 10 libraries.



>> These environment variables are important for running any programs that
>> use the oracle client libraries. The problem you have is that when you
>> run the script from cron these environment variables are not set.
>>
>> Now, there are several ways how to handle this:
>> 1. create a shell script that you call from cron, and it it set the
>> environment variables and then call you python program
>>
>> 2. modify the environment in your python program (via os.environ) and
>> then import cx_Oracle
>>
>> 3. modify your system so that no environment variables are neccesseary -
>> actually this is not possible, but what I have is, symbolic links
>> in /usr/lib to the libraries in $ORACLE_HOME/lib, thus I don't need the
>> LD_LIBRARY_PATH variable, and the only other variable I need is the
>> ORACLE_HOME, which is /usr/share/oracle on my system and it contains
>> bin/  install/  lib/  network/  ocommon/  oracore/  rdbms/  sqlplus/
>> 
>> 
>> 
>> 
>> --
>> damjan

-- 
damjan



More information about the Python-list mailing list