Domanda

Sono codifica un webservice su Python che utilizza un database Oracle. Ho cx_Oracle installato e funzionante, ma sto avendo alcuni problemi quando eseguo il mio codice Python come CGI usando Apache.

Per esempio, il seguente codice funziona perfettamente nella riga di comando:

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

Ma quando l'eseguo come CGI ottengo un "cx_Oracle.InterfaceError: Impossibile acquisire Oracle handle di ambiente". Presso il log di errore apache

Ho cercato in rete e tutti dice che devo impostare il ORACLE_HOME e LD_LIBRARY_PATH variabili d'ambiente. In qualche modo lo script CGI non possono accedere a queste variabili di ambiente anche quando definisco utilizzando os.putenv come si può vedere il codice.

Quello che sto sbagliando? Grazie!

È stato utile?

Soluzione 7

Sono riuscito a risolvere il problema.

In qualche modo l'utente e il gruppo che stava usando apache non hanno avuto accesso alle variabili d'ambiente. Ho risolto il problema modificando l'utente e il gruppo apache stava usando per un utente che ero certo di avere accesso a queste variabili.

E 'strano (e frustrante) che è così difficile da impostare queste variabili utilizzando Python.

Grazie a tutti coloro che ha risposto alla mia domanda!

Altri suggerimenti

Questo è il lavoro per me:

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 che prima putenv, quindi aggiornare environ.

Hai bisogno di questo:

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

invece di utilizzare os.putenv() perché os.environ non aggiorna cx_Oracle, che <=> è presumibilmente guardando.

Documentazione: Varie interfacce di sistema operativo dice: "Nota: Calling putenv () direttamente non cambia os.environ, quindi è meglio modificare os.environ ".

Non dimenticate di aggiungere ENV modulo per Apache:

a2enmod env

in configurazione .htaccess o Apache:

SetEnv LD_LIBRARY_PATH /oracle_lib_path

in / etc / apache2 / envvars non funziona

È possibile eliminare il problema del tutto, se si elimina la necessità di impostare le variabili di ambiente. Ecco una nota su come fare questo con l'installazione del client di instant Oracle sulla propria macchina.

installazione di Oracle Instantclient su Linux senza impostare le variabili di ambiente?

Da pochi Google sul problema, potrebbe essere che il problema è legato alla il finale / in ORACLE_HOME.
Provare a rimuoverlo (e usando anche suggerimento di Richie) e vedere se funziona.

È possibile utilizzare uno script di shell per l'attuazione del CGI, impostare le variabili di ambiente nello script shell e chiamare lo script python dalla shell script.

variabili d'ambiente un'impostazione dalle pitone sembra essere una cosa difficile, soprattutto quando si tratta di come le biblioteche vengono caricati ...

La domanda reale motivo per cui il codice del interrogante non ha funzionato non è ancora stata risolta.

La risposta è che la variabile d'ambiente LD_LIBRARY_PATH viene valutata solo quando viene avviata un'applicazione (in questo caso l'interprete Python). Quando Python è iniziato, è già troppo tardi per pasticciare con questa variabile; e non importa affatto se lo si imposta utilizzando os.environ o os.putenv (ma in genere il primo deve essere usato).

La soluzione è quella di impostare la variabile d'ambiente LD_LIBRARY_PATH in uno script wrapper che avvia lo script Python, o per avviare Apache con la variabile ambiente già impostata. Su openSUSE, si può fare la seconda impostando LD_LIBRARY_PATH in / etc / sysconfig / apache2, per esempio.

A proposito, lo stesso problema esiste quando si utilizza mod_wsgi invece di uno script CGI. Vedere la sezione "Impossibile trovare Python libreria condivisa" a pagina mod_wsgi Problemi di installazione .

Sono le sue dichiarazioni in ordine?

#!/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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top