2009-07-01 27 views
5

Estoy codificando un servicio web en python que usa una base de datos Oracle. Tengo cx_Oracle instalado y en funcionamiento, pero tengo algunos problemas cuando ejecuto mi código python como CGI usando Apache.La secuencia de comandos Python + CGI no puede acceder a las variables de entorno

Por ejemplo el siguiente código funciona perfectamente en la línea de comandos:

#!/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 

Pero cuando lo ejecuto como CGI me sale un "cx_Oracle.InterfaceError: No se puede adquirir de contexto del entorno de Oracle" en el registro de errores de Apache .

He buscado en la red y todo el mundo dice que tengo que establecer las variables de entorno ORACLE_HOME y LD_LIBRARY_PATH. De alguna manera, la secuencia de comandos CGI no puede acceder a estas variables de entorno incluso cuando las defino usando os.putenv como puede ver en el código.

¿Qué estoy haciendo mal? ¡Gracias!

+1

¿Por qué no usas mod_wsgi? –

Respuesta

1

He conseguido resolver el problema.

De alguna manera, el usuario y el grupo que utilizaba apache no tenían acceso a las variables de entorno. Resolví el problema cambiando el usuario y el grupo que apache estaba usando para un usuario que estaba seguro de que tendría acceso a estas variables.

Es extraño (y frustrante) que sea tan difícil establecer estas variables usando Python.

Gracias a todos los que respondieron mi pregunta!

3

usted necesita este:

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

en lugar de utilizar os.putenv()os.putenv() porque no actualiza os.environ, que presumiblemente se cx_Oracle mirando.

Documentación: Miscellaneous operating system interfaces dice: "Nota: Llamar a putenv() directamente no cambia os.environ, por lo que es mejor modificar os.environ."

+0

Gracias por su respuesta. Ya lo he intentado pero no funciona ... – ametade

+1

¿Intenta combinar esta * y * solución de eduffy? – RichieHindle

+0

Nops. Es un problema realmente extraño. Si agrego 'print os.environ' obtengo ORACLE_HOME y LD_LIBRARY_PATH definidos en el diccionario. ¿Podría ser este un problema de configuración de Apache? – ametade

0

¿Están fuera de servicio sus estados de cuenta?

#!/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 
+0

Gracias pero no funcionó. – ametade

1

De a pocos google en el problema, podría ser que su problema está relacionado con el de la / termina en ORACLE_HOME.
Intenta eliminarlo (y también con la sugerencia de Richie) y ver si funciona.

+0

Gracias, pero no funcionó. – ametade

1

Puede usar un script de shell para implementar el CGI, establecer las variables de entorno en el script de shell y llamar al script de python desde el script de shell.

Configuración de variables de entorno desde dentro pitón parece ser una cosa difícil, especialmente cuando se trata de cómo se cargan las bibliotecas ...

5

Esto es trabajo para mí:

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' 

mente que primero putenv, a continuación, actualizar environ.

1

La pregunta real por la cual el código del interrogador no funcionó aún no ha sido respondida.

La respuesta es que la variable de entorno LD_LIBRARY_PATH solo se evalúa cuando se inicia una aplicación (en este caso, el intérprete de Python). Cuando Python ha comenzado, ya es demasiado tarde para meterse con esta variable; y no importa en absoluto si lo configura usando os.environ o os.putenv (pero generalmente debe usarse el primero).

La solución es establecer la variable de entorno LD_LIBRARY_PATH en un script de contenedor que inicia el script de Python, o para iniciar Apache con esa variable de entorno ya configurada. En OpenSUSE, puede hacer esto último configurando LD_LIBRARY_PATH en/etc/sysconfig/apache2, por ejemplo.

Por cierto, el mismo problema existe cuando se usa mod_wsgi en lugar de un script CGI. Consulte la sección "No se puede encontrar la biblioteca compartida de Python" en la página mod_wsgi Installation Issues.

3

No se olvide de añadir env módulo para Apache:

a2enmod env 

en .htaccess o configuración de Apache:

SetEnv LD_LIBRARY_PATH /oracle_lib_path 

en/etc/apache2/envvars no funciona

Cuestiones relacionadas