Question

Je suis un codage webservice sur python qui utilise une base de données Oracle. J'ai cx_Oracle installé et fonctionne, mais je vais avoir quelques problèmes quand je lance mon code python CGI en utilisant Apache.

Par exemple, le code suivant fonctionne parfaitement à la ligne de commande:

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

Mais quand je le lance comme CGI je reçois un « cx_Oracle.InterfaceError: Impossible d'acquérir la poignée de l'environnement Oracle. » Le journal d'erreur apache

Je cherchai le dit Net et tout le monde que je dois mettre la et ORACLE_HOME variables d'environnement LD_LIBRARY_PATH. D'une certaine manière le script CGI ne peut pas accéder à ces variables d'environnement, même quand je les ai définis à l'aide que vous pouvez os.putenv voir le code.

Ce que je suis, je fais mal? Merci!

Était-ce utile?

La solution 7

J'ai réussi à résoudre le problème.

D'une certaine façon l'utilisateur et le groupe qui utilisait apache n'a pas eu accès aux variables d'environnement. Je l'ai résolu le problème en changeant l'utilisateur et le groupe qui utilisait apache à un utilisateur que je suis certain d'avoir accès à cette variable.

Il est étrange (et frustrant) qu'il est si difficile de définir cette variable en utilisant Python.

Merci à tous ceux qui ont répondu à ma question!

Autres conseils

Cela fonctionne pour moi:

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'

esprit que premier putenv, puis mettre à jour environ.

Vous en avez besoin:

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

au lieu d'utiliser parce que os.putenv() ne met pas à jour os.environ cx_Oracle, qui est à la recherche sans doute <=> à.

Documentation: diverses interfaces du système d'exploitation dit: "Remarque: l'appel putenv () ne change pas directement os.environ, il est donc préférable de modifier os.environ. "

Ne pas oublier d'ajouter env module apache:

a2enmod env

dans la configuration .htaccess ou apache:

SetEnv LD_LIBRARY_PATH /oracle_lib_path

dans / etc / apache2 / envvars ne fonctionne pas

Vous pouvez éliminer complètement le problème si vous éliminez la nécessité de définir les variables d'environnement. Voici une note sur la façon de le faire en installant le client Oracle Instant sur votre boîte.

installer Oracle sur Linux instantclient sans définir des variables d'environnement?

À partir de seulement une courte google sur le problème, il se pourrait que votre problème est lié à la terminaison en / ORACLE_HOME.
Essayez de le supprimer (et en utilisant également la suggestion de Richie) et voir si cela fonctionne.

Vous pouvez utiliser un script shell pour mettre en œuvre le CGI, définir les variables d'environnement dans le script shell et appeler le script python du script shell.

variables d'environnement de réglage de l'intérieur python semble être une chose difficile, surtout quand vous traitez avec la façon dont les bibliothèques sont chargées ...

La vraie question pourquoi le code de l'intervenant n'a pas n'a pas encore reçu de réponse.

La réponse est que est seulement évalué l'variable d'environnement LD_LIBRARY_PATH lorsqu'une application est lancée (dans ce cas, l'interpréteur Python). Lorsque Python a commencé, il est déjà trop tard pour jouer avec cette variable; et il n'a pas d'importance du tout si vous définissez à l'aide os.environ ou os.putenv (mais en général l'ancien doit être utilisé).

La solution consiste à définir la variable d'environnement LD_LIBRARY_PATH dans un script d'emballage qui démarre le script Python, ou pour démarrer Apache avec cette variable d'environnement déjà défini. Sur OpenSUSE, vous pouvez faire ce dernier en mettant LD_LIBRARY_PATH dans / etc / sysconfig / apache2, par exemple.

Par ailleurs, le même problème existe avec mod_wsgi au lieu d'un script CGI. Voir la section « Impossible de trouver Python bibliothèque partagée » sur le mod_wsgi Problèmes d'installation .

Vos déclarations sur commande?

#!/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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top