example cx_oracle 12c python oracle build cx-oracle

cx_oracle - python oracle 12c



Problema al construir cx_Oracle-libclntsh.so.11.1=> no encontrado (4)

Estoy intentando compilar cx_Oracle para una instalación de Python 2.7.2 y Oracle 11g, pero cx_Oracle.so no puede encontrar libclntsh.so.11.1, por lo que la importación de cx_Oracle en Python falla.

/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)

Tengo libclntsh.so.11.1 en mi directorio de instalación del cliente de 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

Y el cx_Oracle setup.py está recogiendo este directorio lib:

/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

¿Hay algo obviamente mal con esta configuración?

Gracias

ACTUALIZAR

Mi LD_LIBRARY_PATH contiene el directorio lib anterior con libclntsh.so.11.1

$ echo $LD_LIBRARY_PATH /apps/oracle/client/11.2.0.1/lib

Esto no parece hacer ninguna diferencia. Reconstruyo el archivo cx_Oracle.so y aún muestra libclntsh.so.11.1 => not found cuando ejecuto $ ldd cx_Oracle.so .

Python no puede cargar el módulo construido:

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

Resuelto

El problema estaba relacionado con la variable de entorno LD_LIBRARY_PATH . Debido a las restricciones en la configuración con la que estoy trabajando (corp env) tuve que compilar cx_Oracle como otro usuario (cuenta del sistema). es decir, estaba ejecutando esto:

$ sudo -u username python27 setup.py build

Entonces, aunque LD_LIBRARY_PATH se configuró correctamente para mí, mi versión no se usó cuando el comando se ejecutó como un usuario diferente. Pude construir con éxito moviendo el código fuente a una ubicación donde tenía permisos y ejecutando la compilación como mi usuario.


Agregue /apps/oracle/client/11.2.0.1/home1/lib/ a su LD_LIBRARY_PATH entorno LD_LIBRARY_PATH ejecute el siguiente comando en el terminal antes de ejecutar python o agréguelo a su .bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/apps/oracle/client/11.2.0.1/home1/lib/


Establecer el LD_RUN_PATH . (El enlazador usa LD_RUN_PATH para especificar dónde buscar las bibliotecas solo en tiempo de ejecución).

Ahora construye 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

Esto no requerirá la configuración de LD_LIBRARY_PATH al importar cx_Oracle.


Muchos productos de Oracle instalan oraenv. Establecerá, entre otras variables de entorno, LD_LIBRARY_PATH , por lo tanto, considere ejecutar . oraenv . oraenv lugar de configurar su entorno manualmente.


Sí. Olvidó decirle a su herramienta de caché del cargador que necesita buscar bibliotecas en ese directorio. Agregue ese directorio a /etc/ld.so.conf o un archivo similar y ejecute ldconfig .