2017-08-31 73 views
0

我使用的是Python包名cx_Oracle,这是蟒蛇负载*。所以取决于甲骨文instantclient动态共享库libclntsh.so.11.1当在导入模块

[[email protected] ~]$ ldd /usr/lib64/python2.7/site-packages/cx_Oracle.so 
    linux-vdso.so.1 => (0x00007fffea5fe000) 
    libclntsh.so.11.1 => not found 
    libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f5c02bbe000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5c029a2000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f5c025e0000) 
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f5c023db000) 
    libutil.so.1 => /lib64/libutil.so.1 (0x00007f5c021d8000) 
    libm.so.6 => /lib64/libm.so.6 (0x00007f5c01ed6000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f5c031c1000) 

而且我设置LD_LIBRARY_PATH甲骨文instantclient的家在bash,这是正常工作:

[[email protected] ~]$ export LD_LIBRARY_PATH=/home/wangxw/instantclient 
[[email protected] ~]$ python 
Python 2.7.5 (default, Nov 6 2016, 00:28:07) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import cx_Oracle 
>>> 

但设置蟒蛇LD_LIBRARY_PATH时,它不工作:

[[email protected] ~]$ python 
Python 2.7.5 (default, Nov 6 2016, 00:28:07) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
>>> import os 
>>> os.environ['LD_lIBRARY_PATH'] = '/home/wangxw/instantclient' 
>>> 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 
>>> 

我很好奇python如何加载libclntsh.so.11.1,以及如何在python而不是bash中加载文件。

+0

Python没有使用'LD_LIBRARY_PATH'; 'import cx_Oracle'正在Python路径的一个目录中寻找一个有效的Python模块,它可以通过'PYTHONPATH'环境变量修改。 '.so'文件只是一个文件类型,可以包含一个有效的Python模块以及'.py','.pyc'和'.pyo'文件。 – chepner

+0

谢谢,但我的意思是当cx_Oracle正确加载时,但它的依赖关系('libclntsh.so.11.1')不是。我猜python在'PYTHONPATH'中找到'cx_Oracle'后,'cx_Oracle'通过'LD_LIBRARY_PATH'加载'libclntsh.so.11.1' –

回答

0

您不能在加载需要它的模块的进程内部设置LD_LIBRARY_PATH环境变量。它需要在执行应用程序之前在父进程变量的进程环境中设置。

+0

谢谢,我认为改变'os.environ'不能真的改变进程的env。 –

+0

更改''os.environ''可以改变进程的env,但是对于''.so'' mdoules的动态加载,你可以在代码中修改它的时间太晚了,因为操作系统只查找当进程第一次启动时提供''LD_LIBRARY_PATH''。 –