ctypes не находит установленные в fink библиотеки в / sw / lib - PullRequest
1 голос
/ 19 марта 2012

ctypes не находит библиотеки, установленные через fink, которые живут под /sw/lib/, если я не укажу полный путь к библиотекам

>>> import ctypes
>>> ctypes.CDLL('libgoffice-0.8.dylib')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/sw/lib/python2.7/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(libgoffice-0.8.dylib, 6): image not found
>>> ctypes.CDLL('/sw/lib/libgoffice-0.8.dylib')
<CDLL '/sw/lib/libgoffice-0.8.dylib', handle 336500 at 2b10b0>
>>>

Компиляция этих библиотек с gcc, однако, работает нормально; они всегда найдены. Почему ctypes не находит эти библиотеки и что я могу сделать, чтобы они их нашли?

Это на OS X 10.6.8 с установленным fink Python 2.7 в /sw/bin/python2.7.

1 Ответ

2 голосов
/ 19 марта 2012

Кажется, проблема в том, что fink никогда не устанавливает переменную LD_LIBRARY_PATH.ctypes использует dlopen(), который не будет искать в /sw/lib по умолчанию.Со страницы руководства dlopen:

dlopen () ищет совместимый файл Mach-O в каталогах, заданных набором переменных среды и текущим рабочим каталогом процесса.Если установлено, переменные среды должны содержать разделенный двоеточиями список путей к каталогам, который может быть абсолютным или относительным к текущему рабочему каталогу.Переменными среды являются LD_LIBRARY_PATH, DYLD_LIBRARY_PATH и DYLD_FALLBACK_LIBRARY_PATH.Первые две переменные не имеют значения по умолчанию.Значением по умолчанию для DYLD_FALLBACK_LIBRARY_PATH является $ HOME / lib; / usr / local / lib; / usr / lib.dlopen () ищет каталоги, указанные в переменных среды, в том порядке, в котором они перечислены.

Таким образом, похоже, что решение заключается в том, чтобы поместить в ваши .profile, .bash_profile или .bashrc

export LD_LIBRARY_PATH=/sw/lib:"${LD_LIBRARY_PATH}"

Также кажется, что fink устанавливает некоторые библиотеки в подкаталогах под /sw/lib, например /sw/lib/mysql.В этих случаях вам также придется явно включить их, поскольку кажется, что dlopen() не рекурсивно ищет пути в LD_LIBRARY_PATH.В случае MySQL вам нужно добавить это в путь:

export LD_LIBRARY_PATH=/sw/lib:/sw/lib/mysql:"${LD_LIBRARY_PATH}"
...