Problem beim Erstellen von cx_Oracle - libclntsh.so.11.1 => nicht gefunden
Frage
Ich versuche, cx_Oracle für eine Python 2.7.2- und Oracle 11g-Installation zu erstellen, aber das eingebaute cx_Oracle.so libclntsh.so.11.1 kann nicht gefunden werden, daher schlägt der Import von cx_Oracle in Python fehl.
/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)
Ich habe libclntsh.so.11.1 in meinem Oracle-Client-Installationsverzeichnis:
/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
Und das cx_Orakel setup.py hebt dieses Bibliotheksverzeichnis auf:
/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
Stimmt offensichtlich etwas mit diesem Setup nicht?
Danke
UPDATE
Mein LD_BIBLIOTHEK_PFAD enthält das obige lib-Verzeichnis mit libclntsh.so.11.1
$ echo $LD_LIBRARY_PATH
/apps/oracle/client/11.2.0.1/lib
Das scheint keinen Unterschied zu machen.Ich baue das wieder auf cx_Oracle.so datei und es zeigt immer noch libclntsh.so.11.1 => not found
wenn ich renne $ ldd cx_Oracle.so
.
Python kann das erstellte Modul nicht laden:
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
GEL
Das Problem bezog sich auf die LD_BIBLIOTHEK_PFAD Umgebungsvariable.Aufgrund von Einschränkungen beim Setup, mit dem ich arbeite (corp env), musste ich cx_Oracle als einen anderen Benutzer (Systemkonto) erstellen.also.Ich habe das ausgeführt:
$ sudo -u username python27 setup.py build
Also auch wenn LD_BIBLIOTHEK_PFAD wurde für mich richtig eingestellt, meine Version wurde nicht verwendet, wenn der Befehl als anderer Benutzer ausgeführt wurde.Ich konnte erfolgreich erstellen, indem ich den Quellcode an einen Speicherort verschoben habe, an dem ich Berechtigungen hatte, und den Build als mein Benutzer ausgeführt habe.
Lösung
Hinzufügen /apps/oracle/client/11.2.0.1/home1/lib/
zu Ihrem LD_LIBRARY_PATH
Umgebungsvariable
führen Sie den folgenden Befehl im Terminal aus, bevor Sie Python ausführen, oder fügen Sie ihn Ihrem hinzu .bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/apps/oracle/client/11.2.0.1/home1/lib/
Andere Tipps
Ja.Sie haben vergessen, Ihrem Loader-Cache-Tool mitzuteilen, dass es in diesem Verzeichnis nach Bibliotheken suchen muss.Fügen Sie dieses Verzeichnis hinzu zu /etc/ld.so.conf
oder eine ähnliche Datei und lauf ldconfig
.
Viele Oracle-Produkte installieren oraenv.Es wird unter anderem Umgebungsvariablen festlegen, LD_LIBRARY_PATH
, also erwägen Sie, zu laufen . oraenv
anstatt Ihre Umgebung manuell einzustellen.
Stellen Sie die LD_RUN_PFAD.(LD_RUN_PATH wird vom Linker verwendet, um anzugeben, wo nur zur Laufzeit nach Bibliotheken gesucht werden soll.)
Erstellen Sie nun 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
Dies erfordert nicht die Einstellung von LD_LIBRARY_PATH beim Importieren von cx_Oracle.