2017-10-03 9 views
1

Certains contexteRéglage de la variable d'environnement correct avant d'appeler cx_Oracle sur Linux

Le paquet cx_Oracle, utilisé pour accéder à des bases de données Oracle à partir de Python, nécessite la mise en une variable d'environnement avant le chargement et l'utilisation de l'emballage. Sous Windows, il faut ajouter le dossier instantclient_12_2 au PATH, tandis que sous Linux, la variable d'environnement LD_LIBRARY_PATH doit être définie, pointant vers le dossier instantclient_12_2, ce que vous pouvez accomplir en exécutant la commande suivante dans le shell (avant d'exécuter votre python script):

export LD_LIBRARY_PATH= path/to/instantclient_12_2/folder:$LD_LIBRARY_PATH 

le problème

Sous Windows, si vous ajoutez le dossier instantclient_12_2 à PATH du script python, tout fonctionne comme vous le souhaitez et vous ne devez pas obliger l'utilisateur à changer le PATH manuellement:

# On Windows, it works like a charm 
import os 
os.environ['PATH'] += ';' + 'Z:\\path\\to\\instantclient_12_2\\folder' 
import cx_Oracle 
tns = cx_Oracle.makedsn("server", "port", "DSN") 
connection = cx_Oracle.connect("user", "password", tns) 
cursor = connection.cursor() 
cursor.execute("select * from ...") 

Malheureusement, même ne pas appliquer sur Linux (je suis en cours d'exécution sur Oracle Linux Server version 7.3, qui est CentOS). Le script équivalent (ie paramètre à partir du script python la variable LD_LIBRARY_PATH au lieu d'ajouter au PATH) ne fonctionne pas:

# On Linux, the following code does not work 
import os 
os.environ['LD_LIBRARY_PATH'] = '/path/to/instantclient_12_2/folder' 
import cx_Oracle 
tns = cx_Oracle.makedsn("server", "port", "DSN") 
connection = cx_Oracle.connect("user", "password", tns) 
cursor = connection.cursor() 
cursor.execute("select * from ...") 

Est-il possible de définir la variable d'environnement LD_LIBRARY_PATH sur Linux de telle manière cx_Oracle sera en mesure de utiliser sa valeur pour charger et travailler correctement? Si c'est possible, comment pouvez-vous y parvenir?

Questions connexes

Il y a une myriade de questions o SOF traitant comment définir les variables d'environnement de Python, mais au meilleur de ma connaissance, aucune traitant spécifiquement du problème de chargement cx_Oracle sans avoir besoin de jouer avec variables d'environnement manuellement.

Certaines réponses affirment que "il n'y a aucun moyen de modifier les variables d'environnement à partir d'un processus enfant". Mais dans ce cas, tout code exécuté par cx_Oracle est exécuté dans le contexte créé par le script python principal (c'est-à-dire un processus parent, pas un enfant), alors probablement cx_Oracle devrait pouvoir accéder aux variables d'environnement créées dans ce contexte arrive dans Windows).

Répondre

4

Non, vous ne pouvez pas définir LD_LIBRARY_PATH dans le processus. Cette variable est examinée par le code de démarrage, donc une fois que l'application a démarré, elle est complètement ignorée! Notez que ceci est différent de Windows. La seule façon possible de le faire est de ré-exécuter le processus après avoir défini la variable d'environnement (ou d'exécuter un nouveau processus qui exécute votre code réel) - mais cela ne sera probablement pas une réponse acceptable dans la plupart des cas!

Généralement, la variable d'environnement LD_LIBRARY_PATH est définie dans votre script de connexion, ou bien définie globalement en ajoutant un fichier à /etc/ld.so.conf.d et en exécutant ldconfig. Si aucun d'entre eux n'est acceptable, vous pouvez également créer un script shell simple qui définit la variable d'environnement, puis exécute votre script Python.

Espérons que cela répond à vos questions!

+0

La variable est-elle examinée par le code _startup_? Alors pourquoi ajouter à PATH sur Windows fonctionne? Le mécanisme n'est-il pas le même? Si vous développez sur les raisons de ce comportement, je serais heureux de marquer votre réponse comme la bonne. –

+0

Btw, je me suis retrouvé avec une solution similaire à la création d'un "script shell simple qui définit la variable d'environnement", mais je viens de créer un nouveau script python A (_start.py_) qui prépare l'environnement _system.py_). –

+0

Le comportement de démarrage du processus Windows est différent du comportement de démarrage du processus Linux, donc le processus n'est pas le même! –