ctypes找不到通过/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不定位这些库,我能做些什么来定位它们呢?
这是在OSX10.6.8上,在/sw/bin/python2.7下安装了Python2.7。
发布于 2012-03-19 18:47:01
问题似乎是fink从未设置LD_LIBRARY_PATH变量。ctypes使用默认不会在/sw/lib中搜索的dlopen()。来自dlopen手册页:
dlopen()在目录中搜索由一组环境变量和进程当前工作目录指定的兼容的Mach-O文件。设置时,环境变量必须包含目录路径的冒号-sep数组列表,该列表可以是绝对的,也可以是相对于当前工作目录的。环境变量是LD_LIBRARY_PATH、DYLD_LIBRARY_PATH和DYLD_FALLBACK_LIBRARY_PATH。前两个变量没有默认值。BACK_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}"https://stackoverflow.com/questions/9775425
复制相似问题