J'essaie de construire cx_Oracle pour une installation Python 2.7.2 et Oracle 11g mais le cx_Oracle.so intégré ne peut pas trouver libclntsh.so.11.1, donc l'importation de cx_Oracle dans Python échoue.
/mypath/cx_Oracle-5.1.1/build/lib.linux-x86_64-2.7-11g]$ ldd cx_Oracle.so
libclntsh.so.11.1 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ae9be290000)
libc.so.6 => /lib64/libc.so.6 (0x00002ae9be4ab000)
/lib64/ld-linux-x86-64.so.2 (0x000000389b600000)
J'ai libclntsh.so.11.1 dans mon répertoire d'installation du client Oracle:
/apps/Oracle/client/11.2.0.1/home1/lib]$ ls -l libclntsh.so*
libclntsh.so -> /apps/Oracle/client/11.2.0.1/home1/lib/libclntsh.so.11.1
libclntsh.so.11.1
Et le setup.py cx_Oracle prend ce répertoire lib up:
/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build
/apps/Oracle/client/11.2.0.1/home1/
running build
running build_ext
building 'cx_Oracle' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/apps/Oracle/client/11.2.0.1/home1/rdbms/demo -I/apps/Oracle/client/11.2.0.1/home1/rdbms/public -I/apps/bweb/python-2.7.2/include/python2.7 -c cx_Oracle.c -o build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -DBUILD_VERSION=5.1.1
In file included from /apps/Oracle/client/11.2.0.1/home1/rdbms/public/oci.h:3024,
from cx_Oracle.c:10:
/apps/Oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10788: warning: function declaration isn't a prototype
/apps/Oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10794: warning: function declaration isn't a prototype
gcc -pthread -shared build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -L/apps/Oracle/client/11.2.0.1/home1/lib -lclntsh -o build/lib.linux-x86_64-2.7-11g/cx_Oracle.so
Quelque chose ne va évidemment pas avec cette configuration?
Merci
MISE À JOUR
Mon LD_LIBRARY_PATH contient le répertoire lib ci-dessus avec libclntsh.so.11.1
$ echo $LD_LIBRARY_PATH
/apps/Oracle/client/11.2.0.1/lib
Cela ne semble faire aucune différence. Je reconstruis le fichier cx_Oracle.so et il affiche toujours libclntsh.so.11.1 => not found
quand je lance $ ldd cx_Oracle.so
.
Python n'a pas pu charger le module construit:
Python 2.7.2 (default, Jan 19 2012, 14:38:32)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
RÉSOLU
Le problème était lié à la variable d'environnement LD_LIBRARY_PATH. En raison de restrictions sur la configuration avec laquelle je travaille (corp env), j'ai dû créer cx_Oracle en tant qu'autre utilisateur (compte système). c'est-à-dire que je dirigeais ceci:
$ Sudo -u username python27 setup.py build
Donc, même si LD_LIBRARY_PATH a été défini correctement pour moi, ma version n'a pas été utilisée lorsque la commande a été exécutée en tant qu'utilisateur différent. J'ai pu créer avec succès en déplaçant le code source vers un emplacement où j'avais des autorisations et en exécutant la génération en tant qu'utilisateur.
Ajouter /apps/Oracle/client/11.2.0.1/home1/lib/
à ton LD_LIBRARY_PATH
variable d'environnement exécuter la commande ci-dessous dans le terminal avant d'exécuter python ou l'ajouter dans votre .bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/apps/Oracle/client/11.2.0.1/home1/lib/
Oui. Vous avez oublié de dire à votre outil de cache de chargeur qu'il doit rechercher dans ce répertoire les bibliothèques. Ajoutez ce répertoire à /etc/ld.so.conf
ou un fichier similaire et exécutez ldconfig
.
Définissez LD_RUN_PATH. (LD_RUN_PATH est utilisé par l'éditeur de liens pour spécifier où rechercher les bibliothèques uniquement au moment de l'exécution.)
Maintenant, construisez cx_Oracle.
/mypath/cx_Oracle-5.1.1]$ export LD_RUN_PATH="/apps/Oracle/client/11.2.0.1/home1/lib"
/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build
Cela ne nécessitera pas le réglage de LD_LIBRARY_PATH lors de l'importation de cx_Oracle.
De nombreux produits Oracle installent oraenv. Il définira, entre autres variables d'environnement, LD_LIBRARY_PATH
, alors envisagez d'exécuter . oraenv
au lieu de configurer votre environnement manuellement.