Каков путь CDLL по умолчанию для ctypes? - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь работать с библиотекой, скомпилированной в /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 работал правильно.

1 Ответ

0 голосов
/ 19 сентября 2018

ctypes ( [Python 3.5]: ctypes - библиотека сторонних функций для Python ), использует dlopen ( [man7]: DLOPEN (3) ) для загрузки библиотек, которые делегируют задачу загрузки (и неявного поиска) загрузчику Lnx .

Пути для поиска .so s очень хорошо объяснено в [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 для .so s, добавив его в $ {LD_LIBRARY_PATH} envvar для процесса python , который хочет его загрузить:
    • export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
    • LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib python
  3. Скопируйте .so в одном из путей поиска по умолчанию (хотя я бы не рекомендовал его, но если вам необходимо, скопируйте его в / usr / lib вместо / lib )
...