This site is currently read-only as we are migrating to Oracle Forums for an improved community experience. You will not be able to initiate activity until January 31st, when you will be able to use this site as normal.

    Forum Stats

  • 3,890,899 Users
  • 2,269,649 Discussions
  • 7,916,821 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.