Изменение LD_LIBRARY_PATH во время выполнения для ctypes

Как вы обновляете эту переменную среды во время выполнения, чтобы ctypes могли загружать библиотеку где угодно? Я пробовал следующее и, похоже, не работает.

from ctypes import * os.environ['LD_LIBRARY_PATH'] = "/home/starlon/Projects/pyCFA635/lib" os.putenv('LD_LIBRARY_PATH', "/home/starlon/Projects/pyCFA635/lib") lib = CDLL("libevaluator.so") 

  • Python - Как получить начальный / базовый адрес процесса?
  • Непосредственно используйте библиотеку Intel mkl на Scipy разреженной матрице для вычисления точки AT с меньшим объемом памяти
  • выравнивание контрольной памяти в python ctypes
  • Как передать большие массивы numpy между подпроцессами python без сохранения на диск?
  • Python ctypes: объект файла Python <-> C FILE *
  • Как использовать классы C ++ с ctypes?
  • как передать переменную из включенного шаблона в шаблон, где он включен?
  • Метод __del__ вызывается в python, когда он не ожидается
  • Как я могу получить элементарный логический NOT серии pandas?
  • Как использовать потоки в Python?
  • Получение объектов JSON из текстового файла (с использованием Python)
  • Как заставить деление быть плавающей точкой? Отдел продолжает округлять до 0
  • 4 Solutions collect form web for “Изменение LD_LIBRARY_PATH во время выполнения для ctypes”

    К моменту запуска такой программы, как Python, динамический загрузчик (ld.so.1 или что-то подобное) уже прочитал LD_LIBRARY_PATH и после этого не будет замечен никаких изменений. Таким образом, если только программное обеспечение Python не оценивает LD_LIBRARY_PATH и использует его для создания возможного имени пути библиотеки для dlopen() или эквивалентной функции для использования, установка переменной в скрипте не будет иметь никакого эффекта.

    Учитывая, что вы говорите, что это не работает, кажется правдоподобным предположить, что Python не создает и не пытается использовать все возможные имена библиотек; он, вероятно, полагается только на LD_LIBRARY_PATH.

    Даже если вы дадите полный путь к CDLL или cdll.LoadLibrary (), вам все равно нужно установить LD_LIBRARY_PATH перед вызовом Python. Если явная ссылка на общую библиотеку ссылается на другую разделяемую библиотеку, а в библиотеке для нее не устанавливается «rpath», то она не будет найдена, даже если она уже была загружена. Rpath в библиотеке указывает путь поиска, который будет использоваться для поиска других библиотек, необходимых этой библиотеке

    Например, у меня есть случай набора взаимозависимых сторонних библиотек, которые не были созданы мной. b.so ссылки a.so. Даже если я загружаю a.so заранее:

     ctypes.cdll.LoadLibrary('/abs/path/to/a.so') ctypes.cdll.LoadLibrary('/abs/path/to/b.so') 

    Я получаю ошибку при втором загрузке, потому что b.so относится просто к «a.so», без rpath, и поэтому b.so не знает, что это правильный a.so. Поэтому я должен заранее установить LD_LIBRARY_PATH, чтобы включить '/ abs / path / to'.

    Чтобы избежать необходимости устанавливать LD_LIBRARY_PATH, вы изменяете запись rpath в .so-файлах. В Linux есть две утилиты, которые я делаю так: chrpath и patchelf . chrpath доступен из репозиториев Ubuntu. Он не может изменить rpath на .so, у которого его никогда не было. patchelf более гибкий.

    CDLL может быть передано полное имя пути, поэтому, например, я использую следующее в одном из своих сценариев, где .so находится в том же каталоге, что и скрипт python.

     import os path = os.path.dirname(os.path.realpath(__file__)) dll = CDLL("%s/iface.so"%path) 

    В вашем случае должно быть достаточно.

     from ctypes import * lib = CDLL("/home/starlon/Projects/pyCFA635/lib/libevaluator.so") 

    Скомпилируйте свой двоичный файл с помощью rpath относительно текущего рабочего каталога, например:

     gcc -shared -o yourbinary.so yoursource.c otherbinary.so \ -Wl,-rpath='.',-rpath='./another/relative/rpath' -fpic 

    Затем вы можете изменить рабочий каталог в python во время выполнения с помощью:

     import os os.chdir('/path/to/your/binaries') 

    Подобно этому, загрузчик также находит другие динамические библиотеки, такие как otherbinary.so

    Python - лучший язык программирования в мире.