问题
ctypes isn't finding libraries installed via fink, which live under /sw/lib/, unless I explicitly give the full path to the libraries
>>> 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>
>>>
Compilation against these libraries with gcc, however, works fine; they are always found. Why isn't ctypes locating these libraries, and what can I do to make it locate them?
This is on OS X 10.6.8 with fink-installed Python 2.7 under /sw/bin/python2.7.
回答1:
The problem seems to be that fink never sets the LD_LIBRARY_PATH variable. ctypes uses dlopen() which will not search in /sw/lib by default. From the dlopen man page:
dlopen() searches for a compatible Mach-O file in the directories speci- fied by a set of environment variables and the process's current working directory. When set, the environment variables must contain a colon-sep- arated list of directory paths, which can be absolute or relative to the current working directory. The environment variables are LD_LIBRARY_PATH, DYLD_LIBRARY_PATH, and DYLD_FALLBACK_LIBRARY_PATH. The first two vari- ables have no default value. The default value of DYLD_FALL- BACK_LIBRARY_PATH is $HOME/lib;/usr/local/lib;/usr/lib. dlopen() searches the directories specified in the environment variables in the order they are listed.
So the solution seems to be to put in your .profile, .bash_profile, or .bashrc
export LD_LIBRARY_PATH=/sw/lib:"${LD_LIBRARY_PATH}"
It also seems that fink installs some libraries in subdirectories under /sw/lib, such as /sw/lib/mysql. In these cases, you will have to explicitly include those, as well, because it seems like the dlopen() does not recursively search the paths in LD_LIBRARY_PATH. In the case of MySQL, you would need to add that in the path:
export LD_LIBRARY_PATH=/sw/lib:/sw/lib/mysql:"${LD_LIBRARY_PATH}"
来源:https://stackoverflow.com/questions/9775425/ctypes-doesnt-find-fink-installed-libraries-in-sw-lib