2014-08-27 120 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))