Python + CGI脚本无法访问环境变量

时间:2009-07-01 18:03:48

标签: python apache cgi cx-oracle

我正在编写一个使用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脚本也无法访问此环境变量,正如您在代码中看到的那样。

我做错了什么?谢谢!

9 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

你需要这个:

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

而不是使用os.putenv(),因为os.putenv()不会更新os.environcx_Oracle可能正在查看。

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

答案 2 :(得分:3)

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

a2enmod env

在.htaccess或apache配置中:

SetEnv LD_LIBRARY_PATH /oracle_lib_path
/ etc / apache2 / envvars中的

不起作用

答案 3 :(得分:2)

如果您不需要设置环境变量,则可以完全消除此问题。这是一个关于如何通过在您的盒子上安装Oracle Instant Client来实现此目的的说明。

installing Oracle Instantclient on Linux without setting environment variables?

答案 4 :(得分:1)

从问题的简短google开始,可能是您的问题与/中的结尾ORACLE_HOME有关。
尝试删除它(并使用Richie的建议)并查看它是否有效。

答案 5 :(得分:1)

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

在python中设置环境变量似乎是一件很棘手的事情,特别是在处理库的加载方式时......

答案 6 :(得分:1)

我设法解决了这个问题。

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

使用Python设置这些变量非常困难(并且令人沮丧)。

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

答案 7 :(得分: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 Installation Issues页面上的“无法找到Python共享库”部分。

答案 8 :(得分: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