ctypes在/ sw / lib中找不到fink安装的库

时间:2012-03-19 18:04:07

标签: python ctypes fink

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上,在/sw/bin/python2.7下使用fink安装的Python 2.7。

1 个答案:

答案 0 :(得分:2)

问题似乎是fink从不设置LD_LIBRARY_PATH变量。 ctypes使用的dlopen()默认情况下不会在/sw/lib中搜索。从dlopen手册页:

  

dlopen()在目录中搜索兼容的Mach-O文件   由一组环境变量和过程的当前工作组成   目录。设置时,环境变量必须包含冒号 - sep-   目录路径的arated列表,可以是绝对的或相对的   当前的工作目录。环境变量是LD_LIBRARY_PATH,   DYLD_LIBRARY_PATH和DYLD_FALLBACK_LIBRARY_PATH。前两个变量   ables没有默认值。 DYLD_FALL-的默认值   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}"