script Python + CGI ne peut pas accéder à des variables d'environnement
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!
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