我試圖導入.so
庫到python代碼中以使用c函數。我認爲使用C頭文件Python
from ctypes import *
import ctypes
lib = CDLL('./libcaenhvwrapper.so.5.56')
工作正常。我需要使用在頭文件 中定義的一些用戶定義類型,但我無法訪問它們。
預先感謝您
我試圖導入.so
庫到python代碼中以使用c函數。我認爲使用C頭文件Python
from ctypes import *
import ctypes
lib = CDLL('./libcaenhvwrapper.so.5.56')
工作正常。我需要使用在頭文件 中定義的一些用戶定義類型,但我無法訪問它們。
預先感謝您
的類型是不是在.so
文件的模塊加載。
C型不喜歡這個工作,他們在頭聲明,您必須使用(C)庫的頭,甚至C.
你將不得不使用各種API在Python中重新創建類型。例如,請參閱this part of the tutorial,以瞭解如何使用struct
和union
類型。
現在我的代碼與一個普通的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))