Даже если вы дадите полный путь к CDLL или cdll.LoadLibrary (), вам все равно может потребоваться установить LD_LIBRARY_PATH перед вызовом Python. Если разделяемая библиотека, которую вы загружаете, явно ссылается на другую разделяемую библиотеку и в .so для этой библиотеки не задан «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, который никогда не был. патчелф более гибок.