1
我在尝试在OSX上使用python 3.4(在ipython中)使用ctypes加载依赖库时遇到了很多麻烦。我试图加载libps3000a.dylib
,这取决于libpicoipp.1.dylib
:Python ctypes找不到依赖库
import os
print(os.path.exists("/Applications/PicoScope6.app/Contents/Resources/lib/libps3000a.dylib"))
print(os.path.exists("/Applications/PicoScope6.app/Contents/Resources/lib/libpicoipp.1.dylib"))
%env DYLD_LIBRARY_PATH /Applications/PicoScope6.app/Contents/Resources/lib
%env LD_LIBRARY_PATH /Applications/PicoScope6.app/Contents/Resources/lib
from ctypes import cdll
lib = cdll.LoadLibrary("/Applications/PicoScope6.app/Contents/Resources/lib/libps3000a.dylib")
和输出我得到的是以下几点:
True
True
env: DYLD_LIBRARY_PATH=/Applications/PicoScope6.app/Contents/Resources/lib
env: LD_LIBRARY_PATH=/Applications/PicoScope6.app/Contents/Resources/lib
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-54-df3a8f6477f6> in <module>()
8
9 from ctypes import cdll
---> 10 lib = cdll.LoadLibrary("/Applications/PicoScope6.app/Contents/Resources/lib/libps3000a.dylib")
/Users/jeremy/anaconda/lib/python3.4/ctypes/__init__.py in LoadLibrary(self, name)
427
428 def LoadLibrary(self, name):
--> 429 return self._dlltype(name)
430
431 cdll = LibraryLoader(CDLL)
/Users/jeremy/anaconda/lib/python3.4/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
349
350 if handle is None:
--> 351 self._handle = _dlopen(self._name, mode)
352 else:
353 self._handle = handle
OSError: dlopen(/Applications/PicoScope6.app/Contents/Resources/lib/libps3000a.dylib, 6): Library not loaded: libpicoipp.1.dylib
Referenced from: /Applications/PicoScope6.app/Contents/Resources/lib/libps3000a.dylib
Reason: image not found
谁能告诉我什么,我做错了什么?
我没有使用OS X的经验,但通常Unix系统中的加载器会在进程启动时缓存'LD_LIBRARY_PATH'的值。因此,使用这个环境变量需要一个包装器脚本来预先设置值。或者,如果您自己构建库,则可以在运行时包含一个动态扩展搜索路径的“RPATH”。 – eryksun