ctypes CDLL 默认路径是什么?

问题描述 投票:0回答:2

我正在尝试使用编译为

/usr/local/lib/libName.so
的库,但在运行需要此文件的 python 脚本时:

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

我得到:

OSError: libName.so: cannot open shared object file: No such file or directory

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

python linux python-2.7 ctypes
2个回答
7
投票

[Python.Docs]: ctypes - Python 的外部函数库,使用 [Man7]: DLOPEN(3) 来加载库,它将加载(和隐式查找)任务委托给 Nix装载机。

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

  • 在默认路径/lib中,然后是/usr/lib。 (在某些 64 位体系结构上,64 位共享对象的默认路径是 /lib64,然后是 /usr/lib64。)

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

  1. 将完整路径传递给CDLL

    __lib = CDLL("/usr/local/lib/libName.so")
    
  2. 告诉加载程序在 /usr/local/lib 中搜索 .sos,将其添加到 ${LD_LIBRARY_PATH} 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 中(尽管在某些 OS 上) 他们可以是符号链接编辑))

也可能值得一读 [SO]:通过 ctypes 从 Python 调用的 C 函数返回不正确的值(@CristiFati 的答案)


0
投票

珊妮太棒了!其他人也是如此。这样好吗?

© www.soinside.com 2019 - 2024. All rights reserved.