我正在python脚本中使用cx_Oracle库。如果我直接从Linux终端通过python脚本执行代码,则我的代码工作正常,但是当我将其放入crontab时,出现以下错误。
!! DatabaseError:DPI-1047:无法加载Oracle客户端库:libclntsh.so:无法打开共享对象文件:没有此类文件或目录。参见https://oracle.github.io/odpi/doc/installation.html以获取帮助
DPI-1005:无法获取Oracle环境句柄!! Traceback(最近通话最近):导入cx_Oracle!! DatabaseError:DPI-1005:无法获取Oracle环境句柄
我用谷歌搜索了这个问题,使用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)?它曾是怎样的安装好了吗?它安装在哪里?oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
您的操作系统和版本是什么?CentOS 6.7
您设置了哪些环境变量?您如何设置它们?导出LD_LIBRARY_PATH ='/ usr / lib / oracle / 11.2 / client64 / lib'
显然cron不会加载bash配置文件,因此您需要编写一个包装器。
因此,编写一个bash包装器,该包装器导出所需的变量并调用脚本。然后从crontab调用该包装器。当该方法起作用时,您将知道没有为您编辑了crontab的用户正确导出变量。
注意:您可以将它们添加到/etc/bashrc
中,如果您具有root用户访问权限,那么它将对所有用户都可用。
您还可以制作一个通用包装,然后通过该包装将cron内容发送给它们。
my_bash_wrapper.sh
#!/bin/bash
. ~/.bash_profile
"$0"
在cron中调用:
0 1 * * * /my/loc/my_bash_wrapper.sh my_python_script arg1 arg2
您应该在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
由于它正在寻找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