我在我的python脚本中使用cx_Oracle库。如果我直接从Linux终端执行python脚本,我的代码工作正常但是当我把它放在crontab中时,我得到了以下错误。
!! DatabaseError:DPI-1047:无法加载Oracle客户端库:libclntsh.so:无法打开共享对象文件:没有这样的文件或目录。请参阅https://oracle.github.io/odpi/doc/installation.html获取帮助
DPI-1005:无法获取Oracle环境句柄 !!回溯(最近的呼叫最后): import cx_Oracle !! DatabaseError:DPI-1005:无法获取Oracle环境句柄
我用Google搜索了这个问题,当使用crontab运行时,似乎缺少一些环境变量。 我尝试在crontab中导出以下内容,但它不起作用。
export LD_LIBRARY_PATH =' /usr/lib/oracle/11.2/client64/lib'
如果我删除cx_Oracle包,其他代码运行正常。我的机器上只安装了一个版本的python。
你的Python版本是什么?是32位还是64位? Python 2.6。 64位
你的cx_Oracle版本是什么? 版本6.0b1
您的Oracle客户端版本是什么(例如Instant Client)?它怎么样 安装?它安装在哪里? 甲骨文instantclient11.2-devel的-11.2.0.4.0-1.x86_64.rpm
您的操作系统和版本是什么? CentOS 6.7
您设置了哪些环境变量?你究竟是如何设置它们的? export LD_LIBRARY_PATH =' /usr/lib/oracle/11.2/client64/lib'
答案 0 :(得分:0)
显然cron没有加载bash配置文件,所以你需要编写一个包装器。
因此,编写一个bash包装器,导出所需的变量并调用脚本。然后从crontab调用该包装器。如果有效,您将知道您的变量没有为您编辑过crontab的用户正确导出。
注意:您可以将它们添加到/etc/bashrc
中,如果您具有超级用户权限,则它将适用于所有用户。
你也可以创建一个通用的包装器,然后cron就可以通过包装器发送它们了。
<强> my_bash_wrapper.sh 强>
#!/bin/bash
. ~/.bash_profile
"$0"
在cron中唤起:
0 1 * * * /my/loc/my_bash_wrapper.sh my_python_script arg1 arg2
答案 1 :(得分:0)
您应该在bash脚本中设置ORACLE_HOME和LD_LIBRARY_PATH。
#!/bin/bash
export ORACLE_HOME=/usr/lib/oracle/<version>/client(64)
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
答案 2 :(得分:0)
由于它正在寻找oracle即时客户端路径,因此无法正常工作。 在shell脚本中,添加导出行并将其指向您的oracle客户端路径。接下来,继续编写您的Shell脚本。这将起作用!
#!/bin/sh
export LD_LIBRARY_PATH=/home/<user_name>/opt/oracle/instantclient_19_5:$LD_LIBRARY_PATH
/usr/anaconda3/bin/python /home/<user_name>/test/src/test.py