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