的Python + CGI脚本不能访问环境变量
题
我编码使用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_HOME
和LD_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即时客户端做到这一点的说明。
这只是一个短谷歌对这个问题,它可能是你的问题,是关系到/
的结束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