我编码使用Oracle数据库上蟒一个web服务。我安装cx_Oracle和工作,但我有,当我使用Apache运行我的Python代码为CGI的一些问题。

例如下面的代码完美地工作在命令行:

#!/usr/bin/python 
import os 
import cx_Oracle 
import defs as df 

os.putenv('ORACLE_HOME', '/oracledb/10.2.0/') 
os.putenv('LD_LIBRARY_PATH', '/oracledb/10.2.0/lib') 

con = cx_Oracle.Connection(df.DB_USER, df.DB_PASS, df.DB_SID) 
print con

但是,当我运行它的CGI我得到一个“cx_Oracle.InterfaceError:无法获取Oracle环境句柄”。在Apache的错误日志

我搜索网络和大家说,我必须设置ORACLE_HOMELD_LIBRARY_PATH环境变量。不知怎的,当我确定他们使用os.putenv,你可以在代码中看到的CGI脚本甚至无法访问此环境变量。

我我做错了吗?谢谢!

有帮助吗?

解决方案 7

我已经设法解决这个问题。

不知何故的用户和使用阿帕奇是没有访问该环境变量组。我通过改变阿帕奇使用到,我是一定要访问该变量的用户是在用户和组解决了这个问题。

很奇怪(和令人沮丧的),它是如此困难使用Python设置此变量。

感谢大家的回答我的问题!

其他提示

这是为我工作:

os.putenv('ORACLE_HOME', '/oracle/client/v10.2.0.3-64bit')
os.putenv('LD_LIBRARY_PATH', '/oracle/client/v10.2.0.3-64bit/lib')
os.environ['ORACLE_HOME'] = '/oracle/client/v10.2.0.3-64bit'
os.environ['LD_LIBRARY_PATH'] = '/oracle/client/v10.2.0.3-64bit/lib'

注意,第一putenv,然后更新environ

您需要这样的:

os.environ['ORACLE_HOME'] = '/oracledb/10.2.0/'
os.environ['LD_LIBRARY_PATH'] = '/oracledb/10.2.0/lib'

,而不是使用os.putenv()因为os.putenv()不更新os.environ,其cx_Oracle据推测看。

文档:其他操作系统接口说:“注意:调用运行putenv()直接不改变os.environ,所以最好修改os.environ“。

不要忘记加入的的env 作为apache的模块:

a2enmod env

在.htaccess或apache配置:

SetEnv LD_LIBRARY_PATH /oracle_lib_path

在/ etc / apache2的/ envvars中不起作用

可以,如果你不再需要设置环境变量完全消除这个问题。下面是关于如何在你的机器上安装Oracle即时客户端做到这一点的说明。

在Linux上安装Oracle Instantclient没有设置环境变量<? / A>

这只是一个短谷歌对这个问题,它可能是你的问题,是关系到/的结束ORACLE_HOME。结果 尝试删除它(和使用也从里奇建议),看看它是否工作。

您可以使用一个shell脚本来执行CGI,设置环境变量的shell脚本并从shell脚本调用Python脚本。

从内部蟒蛇似乎是一件棘手的事情,设置环境变量尤其是当你正在处理的库是如何加载中...

实际的问题,为什么提问的代码没有工作还没有得到回答。

答案是当应用程序被启动(在这种情况下,Python解释)环境变量LD_LIBRARY_PATH仅评价。当Python已经开始,这已经是来不及与此变量的混乱;它不会在所有问题你是否使用它os.environ或os.putenv(但一般前者应使用)。设置

的解决方案是设置LD_LIBRARY_PATH环境变量中启动该Python脚本,或与已设定该环境变量启动Apache包装脚本。在openSUSE,可以通过在设置LD_LIBRARY_PATH做后者的/ etc / SYSCONFIG / apache2的,例如

顺便提及,使用的mod_wsgi代替CGI脚本的时存在同样的问题。见段的mod_wsgi 安装问题页“无法找到Python的共享库”

是你的陈述出的顺序?

#!/usr/bin/python 
import os 
os.putenv('ORACLE_HOME', '/oracledb/10.2.0/') 
os.putenv('LD_LIBRARY_PATH', '/oracledb/10.2.0/lib') 

import cx_Oracle 
import defs as df 

con = cx_Oracle.Connection(df.DB_USER, df.DB_PASS, df.DB_SID) 
print con
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top