使用mod_wsgi环境运行cx_Oracle

时间:2012-07-11 19:43:01

标签: apache centos mod-wsgi redhat cx-oracle

我在CentOS 6.2上安装了cx_Oracle。当我从shell导入库时,它工作正常但是当我通过wsgi启动它时,我收到错误:

ImportError: libclntsh.so.10.1: cannot open shared object file: No such file or directory

这是一个环境变量问题:cx_Oracle找不到lib的路径。

我尝试了here

提供的解决方案

我在/ usr / lib目录中添加了libclntsh.so.10.1(带ln)的链接

我编辑了apache配置并添加了:

ORACLE_HOME=/usr/lib/oracle/11.2/client64/lib
LD_LIBRARY_PATH=$ORACLE_HOME/
PATH=$ORACLE_HOME/bin:$PATH

我编辑了/etc/ld.so.conf并添加了:

/usr/lib/oracle/11.2/client64/lib

在ldconfig之后完成

我尝试使用python:

os.env['ORACLE_HOME']='/usr/lib/oracle/11.2/client64/lib'

我用:

编辑了bashrc
export ORACLE_HOME=/usr/lib/oracle/11.2/client64/lib
export LD_LIBRARY_PATH=$ORACLE_HOME/
export PATH=$ORACLE_HOME/bin:$PATH

我还用

编辑了apachectl
ORACLE_HOME=/usr/lib/oracle/11.2/client64/lib
export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/
export LD_LIBRARY_PATH
PATH=$ORACLE_HOME/bin:$PATH
export PATH

我的想法已经不多了。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

编译Oracle的Python模块时,请设置:

LD_RUN_PATH=/usr/lib/oracle/11.2/client64/lib

用户环境变量并将其导出。这将导致该目录嵌入到Python扩展模块.so文件中,并且知道在运行时在何处找到它而无需设置LD_LIBRARY_PATH环境变量。

对于标准的Apache发行版(Linux发行版通常有点不同),设置额外环境变量的文件称为“envvars”,与“httpd”位于同一目录中。对于Linux发行版,通常需要使用特殊的init.d启动脚本。

因此,查找LD_RUN_PATH的全部内容。

答案 1 :(得分:0)

我没有在cx_Oracle rpm上使用 yum install ,而是下载了库的源代码并运行了setup.py构建。

我收到一个错误,指向我试图找到即时客户端sdk库的函数:

possibleIncludeDirs = ["rdbms/demo", "rdbms/public", "network/public","sdk/include"]

浏览Oracle_home文件夹,我发现安装在lib文件夹中的sdk文件(我在oracle上使用yum install安装了skd)而不是在 possibleIncludeDirs 或者包含在setup.py中建议的文件夹:

if not includeDirs:
        path = os.path.join(oracleLibDir, "include")
        if os.path.isdir(path):
            includeDirs.append(path)
    if not includeDirs:
        path = re.sub("lib(64)?", "include", oracleHome)
        if os.path.isdir(path):
            includeDirs.append(path)

我下载了即时客户端sdk(这次是 zip 文件)并将其解压缩到lib文件夹。

然后在lib文件夹中有一个sdk文件夹(/usr/lib/oracle/11.2/client64/lib)

然后我启动了setup.py构建和setup.py安装,它运行良好。