2015-08-15 113 views
1

我在嘗試在OSX上使用python 3.4(在ipython中)使用ctypes加載依賴庫時遇到了很多麻煩。我試圖加載libps3000a.dylib,這取決於libpicoipp.1.dylibPython 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 

誰能告訴我什麼,我做錯了什麼?

回答

0

它看起來像我找到了解決方案。如果您在ipython內核中運行,則ipython中的%env指令不會影響dlopen調用。我將提交一份錯誤報告。

+0

我沒有使用OS X的經驗,但通常Unix系統中的加載器會在進程啓動時緩存'LD_LIBRARY_PATH'的值。因此,使用這個環境變量需要一個包裝器腳本來預先設置值。或者,如果您自己構建庫,則可以在運行時包含一個動態擴展搜索路徑的「RPATH」。 – eryksun