【问题标题】:How python load *.so when import a module导入模块时python如何加载*.so
【发布时间】:2017-08-31 12:19:16
【问题描述】:

我使用的是python包名cx_Oracle,它依赖oracle instantclient动态共享库libclntsh.so.11.1

[wangxw@rhel7 ~]$ 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)

我在 bash 中将 LD_LIBRARY_PATH 设置为 oracle Instantclient 的主页,它工作正常:

[wangxw@rhel7 ~]$ export LD_LIBRARY_PATH=/home/wangxw/instantclient
[wangxw@rhel7 ~]$ 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
>>>

但是当在python中设置LD_LIBRARY_PATH时,它不起作用:

[wangxw@rhel7 ~]$ 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中加载文件。

【问题讨论】:

  • Python 没有使用LD_LIBRARY_PATHimport cx_Oracle 正在 Python 路径中的目录中寻找有效的 Python 模块,可以通过 PYTHONPATH 环境变量进行修改。 .so 文件只是可以包含有效 Python 模块的文件类型,以及 .py.pyc.pyo 文件。
  • 谢谢,但我的意思是当 cx_Oracle 正确加载时,但它的依赖项 (libclntsh.so.11.1) 不是。我猜python在PYTHONPATH 中找到cx_Oracle之后,然后cx_Oracle通过LD_LIBRARY_PATH加载libclntsh.so.11.1

标签: python import shared-libraries


【解决方案1】:

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

【讨论】:

  • 谢谢,我认为改变os.environ并不能真正改变进程的环境。
  • 改变os.environ可以改变进程的环境,但是对于.so mdoules的动态加载,你可以从你的代码中改变它为时已晚,因为操作系统只寻找值LD_LIBRARY_PATH 进程首次启动时。
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2011-01-01
  • 2018-03-16
  • 1970-01-01
相关资源
最近更新 更多