2012-08-24 105 views
0

我有一個從python裏面調用第三方c函數的需求。 爲此,我創建了一個具有所有python特定c代碼(使用METH_VARARGS)來調用第三方函數的c api。我掛這個代碼liba.so與3方庫libb.so 在我的Python文件,我在做:從python調用第三方c函數

import liba * 

的Python現在笙歌libb.so沒有找到。 我在做什麼錯?

回答

1

您必須在您的PATH中包含liba.so,否則Python將不知道在哪裏查找它。

嘗試下面的代碼,它會加載庫,如果它可以從PATH找到它,否則它會嘗試從負載腳本

from ctypes import * 
from ctypes.util import find_library 
import os 


if find_library('a'): 
    liba = CDLL(find_library('a')) 
else: 
    # library is not in your path, try loading it from the current directory 
    print 'liba not found in system path, trying to load it from the current directory' 
    print '%s/%s'%(os.path.dirname(__file__),'liba.so') 
    liba = CDLL(os.path.join(os.path.dirname(__file__),'liba.so')) 

http://docs.python.org/library/ctypes.html#finding-shared-libraries

的目錄加載它更新:我想知道爲什麼你創建一個本地庫(liba)來訪問本地第三方庫(libb)。您可以使用​​將第三方c庫直接導入python,併爲libb創建python(非本機)包裝器。例如調用標準C的lib time你會做

>>> from ctypes import * 
>>> lib_c = CDLL("libc.so.6") 
>>> print lib_c.time(None) 
1150640792 

和libb

>>> from ctypes import * 
>>> lib_b = CDLL("libb") 
>>> lib_b.hello_world(None) 
+0

我確信liba.so和libb.so都在我的道路。仍然有同樣的問題。沒有找到libb.so(第三方庫) – marvel

+0

它能夠找到liba.so ..但抱怨與liba.so鏈接的libb.so.我確信libb.so也在路徑 – marvel

+0

因此,如果你做'CDLL(find_library('b'))'它的工作原理?也注意到你在輸入'liba'時有點奇怪,你應該執行'import liba'或'from lib import *'不要'import liba *'後者是無效的語法 ' –