Forum Stats

  • 3,767,822 Users
  • 2,252,720 Discussions
  • 7,874,338 Comments

Discussions

cx_Oracle error when used in a cron job

700084
700084 Member Posts: 4
edited Sep 21, 2009 12:55PM in Python
Hi everyone,
I've installed cx_Oracle and used it successfully in a number of python scripts, but it's throwing an error when I try to run one of those python scripts as a cron job.

Below is the traceback that I'm logging from the cronjob:
 
<<snipped>>
  import cx_Oracle
  File "build/bdist.linux-i686/egg/cx_Oracle.py", line 7, in <module>
  File "build/bdist.linux-i686/egg/cx_Oracle.py", line 6, in __bootstrap__
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
Again, the script works fine if I run it manually (i.e. "python script.py"). I've googled around for hours and can't seem to figure this out.

Anyone have suggestions?
It's greatly appreciated.
Serdar

Answers

  • 390020
    390020 Member Posts: 446
    I would say there's something defined in your environment that's not available at cron time. For example, LD_LIBRARY_PATH, it might be defined in your ~/.bashrc
    You could try modify the os environ before importing cx_Oracle.
    E.g:

    import os
    os.environ['LD_LIBRARY_PATH'] = ':~/oracle/product/10.2.0/client/lib'
    import cx_Oracle
    ..
    390020
  • 700084
    700084 Member Posts: 4
    Mariano wrote:
    I would say there's something defined in your environment that's not available at cron time. For example, LD_LIBRARY_PATH, it might be defined in your ~/.bashrc
    This is precisely what turned out to the be problem. I had a number of environment variables set in my .bashrc, including ORACLE_HOME, LD_LIBRARY_PATH and TNS_NAME.
    You could try modify the os environ before importing cx_Oracle.
    E.g:

    import os
    os.environ['LD_LIBRARY_PATH'] = ':~/oracle/product/10.2.0/client/lib'
    import cx_Oracle
    ..
    The above approach did not work in my case. Instead, I had to copy all of the variables mentioned above from my .bashrc into the top of my crontab, so that it appeared like this:
    [email protected]
    SHELL=/bin/bash
    PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/oracle/11.1/client/lib/
    ORACLE_HOME='/usr/lib/oracle/11.1/client'
    LD_LIBRARY_PATH ='/usr/lib/oracle/11.1/client/lib'
    TNS_ADMIN  =  '/home/username'  # where my tnsnames.ora file lives
    
    # m h  dom mon dow   command
    <<snipped>>
    Now everything's working like a charm. Thanks so much for the help Mariano. You rock!

    Regards,
    Serdar
  • 390020
    390020 Member Posts: 446
    edited Sep 21, 2009 12:55PM
    Glad to know it help you to debug the problem.
    It seems I made a mistake in my suggestion (os.environ is a dict, actually it seems I don't really know who to publish in this forum):
    import os
    os.environ\['LD_LIBRARY_PATH'\] = ':~/oracle/product/10.2.0/client/lib'

    anyway... if it works, don't fix it!
This discussion has been closed.