Pregunta

Estoy codificación de un servicio web en Python que utiliza una base de datos Oracle. Tengo cx_Oracle instalado y funcionando pero estoy teniendo algunos problemas cuando corro mi código Python como CGI usando Apache.

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 consigo 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 ajustar el ORACLE_HOME variables de entorno y LD_LIBRARY_PATH. De alguna manera, la secuencia de comandos CGI no pueden acceder a este variables de entorno, incluso cuando defino utilizando os.putenv como se puede ver en el código.

Lo que estoy haciendo mal? Gracias!

¿Fue útil?

Solución 7

He conseguido resolver el problema.

De alguna manera el usuario y el grupo que estaba usando Apache no tuvieron acceso a las variables de entorno. He resuelto el problema cambiando el usuario y grupo que estaba usando Apache a un usuario que estaba seguro de tener acceso a estas variables.

Es extraño (y frustrante) que es tan difícil de configurar estas variables usando Python.

Gracias a todos los que respondieron a mi pregunta!

Otros consejos

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.

Esto es necesario:

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

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

Documentación: interfaces de diversos del sistema operativo dice: "Nota: Llamada putenv () directamente no cambia os.environ, por lo que es mejor modificar os.environ ".

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

a2enmod env

en la configuración .htaccess o Apache:

SetEnv LD_LIBRARY_PATH /oracle_lib_path

en / etc / apache2 / envvars no funciona

Puede eliminar el problema por completo si se elimina la necesidad de ajustar las variables de entorno. Aquí hay una nota sobre cómo hacer esto mediante la instalación del cliente instantáneo de Oracle en su caja.

la instalación de Oracle en Linux Instantclient sin establecer las variables de entorno

A partir de sólo un corto de Google en el problema, podría ser que su problema está relacionado con el que termina la / en ORACLE_HOME.
Trate de extraerlo (y también el uso de la sugerencia de Richie) y ver si funciona.

Se puede usar un script de shell para ejecutar el CGI, establecer las variables de entorno en el shell script y llamar a la secuencia de comandos de Python desde el script de shell.

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

La pregunta real de por qué el código del interrogador no funcionaba aún no ha recibido ninguna respuesta.

La respuesta es que la variable de entorno LD_LIBRARY_PATH sólo 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 tiene ninguna importancia si se establece que el uso de os.environ o os.putenv (pero por lo general el primero debe ser utilizado).

La solución es establecer la variable de entorno LD_LIBRARY_PATH en un guión envoltorio que se inicia la secuencia de comandos de Python, o para iniciar Apache con esa variable de entorno ya establecido. En OpenSUSE, se puede hacer esto último mediante el establecimiento de LD_LIBRARY_PATH en / etc / sysconfig / apache2, por ejemplo.

Por cierto, el mismo problema existe cuando se utiliza mod_wsgi en lugar de un script CGI. Vea la sección "No es posible encontrar Python biblioteca compartida" en la página Problemas de instalación .

Son sus declaraciones fuera de orden?

#!/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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top