我正在尝试为Python2.7.2和Oracle11g安装构建cx_Oracle,但构建cx_Oracle.so 找不到libclntsh.so.11.1所以在Python中导入cx_Oracle失败。

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

我有 libclntsh.so.11.1 在我的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

和cx_Oracle setup.py 把这个图书馆的目录捡起来了吗?:

/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

这个设置有什么明显的问题吗?

谢谢

更新资料

我的 LD_LIBRARY_PATH 包含上面的lib目录 libclntsh.so.11.1

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

这似乎没有什么区别。我重建cx_Oracle.so 文件,它仍然显示 libclntsh.so.11.1 => not found 当我跑 $ ldd cx_Oracle.so.

Python未能加载构建的模块:

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

解决了

该问题与 LD_LIBRARY_PATH 环境变量。由于对我正在使用的设置的限制(corp env),我不得不将cx_Oracle构建为另一个用户(系统帐户)。即我在经营这个:

$ sudo -u username python27 setup.py build

所以尽管如此 LD_LIBRARY_PATH 为我正确设置,当命令作为不同的用户执行时,我的版本没有被使用。我能够通过将源代码移动到我有权限的位置并以我的用户身份运行构建来成功构建。

有帮助吗?

解决方案

添加 /apps/oracle/client/11.2.0.1/home1/lib/ 致你的 LD_LIBRARY_PATH 环境变量 在运行python之前,在终端中执行下面的命令,或者将其添加到您的 .bashrc

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

其他提示

是的.您忘记告诉您的加载器缓存工具,它需要在该目录中查找库。将该目录添加到 /etc/ld.so.conf 或类似的文件并运行 ldconfig.

许多oracle产品安装oraenv。它将设置,以及其他环境变量, LD_LIBRARY_PATH, ,所以考虑运行 . oraenv 而不是手动设置环境。

设置 LD_RUN_PATH.(链接器使用LD_RUN_PATH指定仅在运行时查找库的位置。)

现在构建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

这不需要在导入cx_Oracle时设置LD_LIBRARY_PATH。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top