2014-08-27 78 views
0

我試圖導入.so庫到python代碼中以使用c函數。我認爲使用C頭文件Python

from ctypes import * 
import ctypes 
lib = CDLL('./libcaenhvwrapper.so.5.56') 

工作正常。我需要使用在頭文件 中定義的一些用戶定義類型,但我無法訪問它們。

預先感謝您

回答

0

的類型是不是在.so文件的​​模塊加載。

C型不喜歡這個工作,他們在頭聲明,您必須使用(C)庫的頭,甚至C.

你將不得不使用各種​​API在Python中重新創建類型。例如,請參閱this part of the tutorial,以瞭解如何使用structunion類型。

0

現在我的代碼與一個普通的c庫一起工作,但我需要使用來自卡昂的.so庫和我 得到Segmentation故障。這是代碼:

from ctypes import * 
lib = CDLL('./libcaenhvwrapper.so.5.56') 
lib.CAENHVInitSystem.restype = c_int 
lib.CAENHVInitSystem.argtypes = [c_int, c_int, c_char_p, c_char_p, c_char_p] 
lib.CAENHVGetError.restype = c_int  

CAENHV_SYSTEM_TYPE_t = c_int 
sy1527 = CAENHV_SYSTEM_TYPE_t(0) 
sy2527 = CAENHV_SYSTEM_TYPE_t(1) 
sy4527 = CAENHV_SYSTEM_TYPE_t(2) 
sy5527 = CAENHV_SYSTEM_TYPE_t(3) 
n568 = CAENHV_SYSTEM_TYPE_t(4) 
v65xx = CAENHV_SYSTEM_TYPE_t(5) 
n1470 = CAENHV_SYSTEM_TYPE_t(6) 
v8100 = CAENHV_SYSTEM_TYPE_t(7) 

link = c_int 
LINKTYPE_TCPIP = link(0) 
LINKTYPE_RS232 = link(1) 
LINKTYPE_CAENET = link(2) 
LINKTYPE_USB = link(3) 
LINKTYPE_OPTLINK = link(4) 
LINKTYPE_USB_VCP = link(5) 

string15=c_char*15 
address=string15('1','3','7','.','1','3','8','.','1','3','.','2','0','3','\0') 

userName = c_char_p('user') 
passwd = c_char_p('user') 
ret_init = lib.CAENHVInitSystem(0, 0, address, userName, passwd) 

當我嘗試調用函數我得到一個段錯誤。我認爲這些類型是正確定義的。 下面您可以看到一段可以正常工作的代碼。

from ctypes import * 
lib2 = CDLL('/lib64/libc.so.6') 
string15=c_char*15 
address=string15('1','3','7','.','1','3','8','.','1','3','.','2','0','3','\0') 
address1=create_string_buffer('137.138.13.203') 
address2=c_char_p('137.138.13.200') 

userName = c_char_p('user') 
passwd = c_char_p('user') 

a= lib2.strncmp(address, userName, c_int(4))  
a= lib2.strncmp(userName, address, 4) 
a= lib2.strncmp(address2, address, 15) 

lib2.printf('%d\n', ret_init) 
lib2.printf('%s\n', address) 
lib2.printf('%s\n', address1) 
lib2.printf('%s\n', address2) 
lib2.printf('%d\n', lib2.strlen(address)) 
lib2.printf('%d\n', lib2.strlen(address1)) 
lib2.printf('%d\n', lib2.strlen(address2))