Frage

Ich bin Codierung eine Webservice auf Python, die eine Oracle-Datenbank verwendet. Ich habe cx_Oracle installiert und arbeitet, aber ich habe einige Probleme, wenn ich meinen Python-Code als CGI mit Apache ausgeführt werden.

Zum Beispiel der folgende Code funktioniert perfekt in der Befehlszeile:

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

Aber wenn ich es als CGI laufen lasse, bekomme ich einen „cx_Oracle.InterfaceError: Kann nicht Oracle-Umgebung Griff erwerben“. Im Apache-Fehlerprotokoll

suchte ich im Netz und jeder sagt, dass ich das ORACLE_HOME und LD_LIBRARY_PATH Umgebungsvariablen zu setzen habe. Irgendwie das CGI-Skript auch diese Umgebungsvariablen nicht zugreifen können, wenn ich sie os.putenv mit definieren, wie Sie den Code sehen können.

Was ich mache ich falsch? Dank!

War es hilfreich?

Lösung 7

Ich habe es geschafft, das Problem zu lösen.

Irgendwie ist der Benutzer und die Gruppe, die Apache wurde mit keinem Zugang zu den Umgebungsvariablen. Ich löste das Problem, indem der Benutzer ändern und Gruppe, die Apache wurde an einen Benutzer mit, dass ich sicher war, Zugriff auf diese Variablen haben.

Es ist seltsam (und frustrierend), dass es so schwierig ist, diese Variablen mit Python zu setzen.

Vielen Dank an alle, die meine Frage beantwortet!

Andere Tipps

Dies funktioniert für mich:

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'

Kenntnis, dass sich erste putenv, dann environ aktualisieren.

Sie müssen dies:

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

anstelle os.putenv() der Verwendung, weil os.putenv() nicht aktualisiert os.environ, die cx_Oracle vermutlich betrachtet.

Dokumentation: Sonstiges Betriebssystem-Schnittstellen sagt: "Hinweis: Der Aufruf putenv () os.environ nicht direkt ändern, so ist es besser os.environ zu ändern. "

Vergessen Sie nicht das Hinzufügen env Modul für Apache:

a2enmod env

in .htaccess oder Apache-Konfiguration:

SetEnv LD_LIBRARY_PATH /oracle_lib_path

in / etc / apache2 / envvars funktioniert nicht

Sie können das Problem gänzlich beseitigen, wenn Sie die Notwendigkeit beseitigen, um die Umgebungsvariablen zu setzen. Hier ist ein Hinweis, wie Sie dies tun, indem Sie den Oracle Instant Client auf Ihrem System installieren.

Installation Oracle instant auf Linux ohne Umgebungsvariablen

Von nur eine kurzen google es könnte das Problem sein, dass Ihr Problem mit dem der Endung / in ORACLE_HOME zusammenhängt.
Versuchen Sie das Entfernen es (und auch mit Vorschlag von Richie) und sehen, ob es funktioniert.

Sie können ein Shell-Skript verwenden, um die CGI zu implementieren, um die Umgebungsvariablen in der Shell-Skript festgelegt und das Python-Skript aus dem Shell-Skript aufrufen.

Einstellung von Umgebungsvariablen aus Python scheint eine heikle Sache zu sein, vor allem, wenn man es zu tun mit, wie Bibliotheken geladen ...

Die eigentliche Frage, warum der Code der Fragesteller nicht hat nicht funktioniert noch nicht beantwortet worden.

Die Antwort ist, dass die Umgebungsvariable LD_LIBRARY_PATH wird nur ausgewertet, wenn eine Anwendung gestartet wird (in diesem Fall des Python-Interpreter). Wenn Python begonnen hat, ist es schon zu spät, um Chaos mit diesen Variablen; und es spielt keine Rolle, ob überhaupt Sie es einrichten mit os.environ oder os.putenv (aber in der Regel der ehemaligen soll verwendet werden).

Die Lösung ist die Umgebungsvariable LD_LIBRARY_PATH in einem Wrapper-Skript zu setzen, die den Python-Skript gestartet wird, oder Apache starten mit dieser Umgebungsvariable bereits festgelegt. Auf OpenSUSE, können Sie das letztere tun, indem Sie LD_LIBRARY_PATH in / etc / sysconfig / apache2, zum Beispiel.

Übrigens besteht das gleiche Problem bei der Verwendung von mod_wsgi anstelle eines CGI-Skript. Siehe Abschnitt „Kann nicht Python Shared Library finden“ auf der mod_wsgi Installationsprobleme Seite .

Sind Ihre Aussagen aus der Ordnung?

#!/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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top