python - ctypes CDLL 默认路径是什么?

标签 python linux python-2.7 ctypes

我正在尝试使用编译为 /usr/local/lib/libName.so 的库,但在运行需要此文件的 python 脚本时:

from ctypes import CDLL
[...]
__lib = CDLL('libName.so')

我得到:

OSError: libName.so: 无法打开共享对象文件:没有这样的文件或目录

所以我想知道我需要在哪里复制 .so 文件,以便这个 CDLL 调用正常工作。

最佳答案

[Python.Docs]: ctypes - A foreign function library for Python , 使用 [Man7]: DLOPEN(3)为了加载库,它将加载(和隐式查找)任务委托(delegate)给 Nix 加载器。

搜索.so 的路径在[Man7]: LD.SO(8) 中有很好的解释。 .以下是它对默认值的说明:

  • In the default path /lib, and then /usr/lib. (On some 64-bit architectures, the default paths for 64-bit shared objects are /lib64, and then /usr/lib64.)

解决问题的方法(最常见):

  1. 将完整路径传递给 CDLL:

    __lib = CDLL("/usr/local/lib/libName.so")
    
  2. 通过将其添加到${LD_LIBRARY_PATH},告诉加载程序也搜索 /usr/local/lib 以查找 .so em> env var 用于要加载它的 Python 进程:

    • >
      export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
      # ...
      python
      
    • >
      LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib python
      
  3. .so 复制到默认搜索路径之一(虽然我不推荐这样做,但如果必须的话,将其复制到 /usr/lib 而不是 /lib(尽管在某些 OSes 上它们可以被symlinked))

可能还值得一读 [SO]: C function called from Python via ctypes returns incorrect value (@CristiFati's answer) .

关于python - ctypes CDLL 默认路径是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52401840/

相关文章:

python - 在 mac OS 上从 python 运行 firefox selenium webdriver 无法启动

mysql - 更改mysql数据库的位置

linux - 如何开始编写合成 WM?

python - 没有这样的文件或目录 : 'gs' linux

python-2.7 - 如何将2D椭圆拟合到给定点

python - 私有(private) PyPI 的 pip.conf 中的凭证

python - 如何定位 virtualenv 安装

python - 编码分类变量后如何跟踪列?

python - 从 Python shell 运行 Python 脚本

python-2.7 - NetworkX - 在图上寻找点的自然簇