2016-01-14 109 views
4

我想建立兩個相關的康達包裝共享庫:安裝並找到暢達

  1. 共享對象文件libfoo.so編譯代碼
  2. 圍繞代碼
  3. 一個Python包裝,foopy

導入後,foopy模塊需要找到libfoo.so文件,然後將其與ctypes一起使用:

so_directory = ??? 
lib = ctypes.cdll.LoadLibrary(os.path.join(so_directory, 'libfoo.so')) 

如何可靠地找到libfoo.so文件所在的位置?我很樂意改變任何配方。

+0

我懷疑一些你一起工作的人都會知道這個問題的答案一個:-) –

+3

事實上,我已經指出他們這個。儘管在公共場合提問並記錄答案會更好。幫助所有參與者而不僅僅是我。 – MRocklin

回答

5

我會建議將.so安裝到PREFIX/lib文件夾 - 換句話說,將它放在默認搜索路徑上。

對於Windows/Anaconda,這是PREFIX/Library/bin。

編輯:

PREFIX就是無論你已經安裝了Python。這可能是/ usr或/ usr/local或〜/ miniconda

另外:

您應該刪除os.path.join位,只是通過文件名到DLL加載。它會查找默認路徑,只要您從PREFIX運行python,就會包含上面提到的路徑。

+0

這個軟件包只會在Linux上使用。這種情況下的前綴是什麼?另外,您是否可以驗證這是在用戶空間中,而不是在系統空間中(我不一定具有寫權限)。 – MRocklin

+0

PREFIX就是您安裝了Miniconda/Anaconda的任何位置。這是安裝的根源。常見默認示例:〜/ miniconda – msarahan

+0

好的,那麼'foopy'如何可靠地找到那個文件呢?在系統加載庫路徑中放置了〜/ miniconda/envs/my-env/lib嗎? – MRocklin

1

我想我會使用相對路徑。

這是一個相關的帖子。 Python ctypes: loading DLL from from a relative path

假設我們已經在某個隨機位置激活了conda env $BAR。我一定會把你的libfoo.so置於$BAR/lib/libfoo.so。要做到這一點,只要確保conda-build將它放在$PREFIX/lib/libfoo.so即可。

那麼假設我們有foopy項目,標準爲setup.py,代碼爲foopy/__init__.py。這將得到pip或conda安裝到$BAR/lib/python2.7/site-packages/foopy/__init__.py。 (或者python3.x)所以foopy/__init__.py內容會像

import os.path 
fourup = '../../../..' 
libdir = os.path.normpath(os.path.join(__file__, fourup)) 

import ctypes 
lib = ctypes.CDLL(os.path.join(libdir, 'libfoo.so') 
+0

假設libfoo是由conda安裝的,這對我來說似乎很理智。據推測,我們可以嘗試這一點,並相信操作系統按順序查找庫。 – MRocklin