6

我正在使用 Oracle 数据库的 python 上编写 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 运行时,我在 apache 错误日志中收到“cx_Oracle.InterfaceError:无法获取 Oracle 环境句柄”。

我搜索了网络,每个人都说我必须设置ORACLE_HOMELD_LIBRARY_PATH环境变量。不知何故,即使我使用os.putenv您在代码中看到的定义它们,CGI 脚本也无法访问此环境变量。

我做错了什么?谢谢!

4

9 回答 9

5

这对我有用:

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

于 2011-03-22T16:31:57.413 回答
3

你需要这个:

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

而不是使用os.putenv()because os.putenv()doesn't update os.environ,这cx_Oracle大概是在看。

文档:Miscellaneous operating system interfaces说:“注意:直接调用 putenv() 不会改变 os.environ,所以最好修改 os.environ。”

于 2009-07-01T18:06:19.110 回答
3

不要忘记为 apache添加env模块:

a2enmod env

在 .htaccess 或 apache 配置中:

SetEnv LD_LIBRARY_PATH /oracle_lib_path

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

于 2012-01-24T12:37:19.687 回答
2

如果您无需设置环境变量,则可以完全消除该问题。这是关于如何通过在您的盒子上安装 Oracle Instant Client 来执行此操作的说明。

在 Linux 上安装 Oracle Instantclient 而不设置环境变量?

于 2009-07-03T07:10:02.073 回答
2

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

不知何故,apache 使用的用户和组无权访问环境变量。我通过将 apache 正在使用的用户和组更改为我确定可以访问此变量的用户来解决了这个问题。

使用 Python 设置这些变量非常困难,这很奇怪(也令人沮丧)。

感谢所有回答我问题的人!

于 2009-07-17T14:17:25.643 回答
1

从这个问题的简短谷歌上看,您的问题可能/ORACLE_HOME.
尝试删除它(并使用 Richie 的建议),看看它是否有效。

于 2009-07-01T18:32:57.880 回答
1

您可以使用 shell 脚本来实现 CGI,在 shell 脚本中设置环境变量并从 shell 脚本中调用 python 脚本。

从 python 中设置环境变量似乎是一件棘手的事情,尤其是当您处理库的加载方式时......

于 2009-07-01T18:42:52.390 回答
1

提问者的代码为什么不起作用的实际问题尚未得到解答。

答案是环境变量 LD_LIBRARY_PATH 仅在应用程序启动时评估(在本例中为 Python 解释器)。当 Python 已经启动时,再去处理这个变量已经太迟了;无论您使用 os.environ 还是 os.putenv 设置它都没有关系(但通常应该使用前者)。

解决方案是在启动 Python 脚本的包装脚本中设置 LD_LIBRARY_PATH 环境变量,或者在已设置该环境变量的情况下启动 Apache。例如,在 OpenSUSE 上,您可以通过在 /etc/sysconfig/apache2 中设置 LD_LIBRARY_PATH 来完成后者。

顺便说一句,使用 mod_wsgi 代替 CGI 脚本时也存在同样的问题。请参阅 mod_wsgi安装问题页面上的“无法找到 Python 共享库”部分。

于 2011-11-30T18:42:25.010 回答
0

你的陈述有问题吗?

#!/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
于 2009-07-01T18:07:35.210 回答