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

6 投票
9 回答
8380 浏览
提问于 2025-04-15 12:37

我正在用Python编写一个网络服务,使用的是Oracle数据库。我已经安装并且可以正常使用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这两个环境变量。但不知怎么的,CGI脚本似乎无法访问这些环境变量,即使我在代码中用os.putenv定义了它们。

我到底哪里做错了呢?谢谢!

9 个回答

3

你需要这样做:

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。”

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

2

我已经解决了这个问题。

不知怎么的,Apache使用的用户和组没有权限访问环境变量。我通过把Apache使用的用户和组改成一个我确定能访问这些变量的用户来解决了这个问题。

真是奇怪(而且让人沮丧),用Python设置这些变量竟然这么困难。

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

撰写回答