C.so库Python

2024-06-24 13:51:23 发布

您现在位置:Python中文网/ 问答频道 /正文

现在我的代码使用一个普通的c库,但是我需要使用一个.so库,我和Caen的代码出现了分段错误。代码如下:

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(adrress2))

Tags: 代码addresslibtypelinkusernamesystemint
1条回答
网友
1楼 · 发布于 2024-06-24 13:51:23

通过快速搜索:

CAENHVRESULT CAENHVInitSystem(
const char *SystemName, // In
int     LinkType,
void     *Arg,
const char *UserName,
const char *Password
);

第一个参数id肯定是一个“指向char的指针”,您应该这样声明它:

lib.CAENHVInitSystem.argtypes = [c_char_p, c_int, c_int, c_char_p, c_char_p, c_char_p]

此外:

ret_init =  lib.CAENHVInitSystem(0, 0, address, userName, passwd)
#                                ^

NULL传递为SystemName(在大多数系统中,NULL是((void*)0))。根据我快速阅读的the doc,这是不明确支持的。你知道吗

This is the first function with parameter SystemName to call, and it must be called for all the HV power supplies the user wants to control

相关问题 更多 >