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).
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. –
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_). –
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! –