最近项目中需要用Python调用C/C++的动态库,研究了一下Ctypes。
上游给出的是编译好的.so文件,以下是用Ctypes调用的方式:
from ctypes import *
lib = cdll.LoadLibrary('./xxx.so')
#假设xxx.so定义了一个init函数
init = lib.init
init()
#关于类型和参数:
i = c_int(2)
# int size
pChar = (c_char_p * 4)(addressof(create_string_buffer(8)))
# char * pChar = new char[8];
c_char_p("CERTAIN_STRING".encode("utf-8"))
# "CERTAIN_STRING".c_str()
data = [1,2,3,4,5]
p_data = (c_ubyte * len(data))(*data)
# unsigned char * data
int_list = [1,2,3,4]
p_int_list = pointer((c_int*(4))(*int_list))
# int * int_list
#关于返回:
#API int* rec(int* p)
p = pointer(c_int(0))
rec = lib.rec
rec.restype = POINTER(c_int)
rs = rec(p)
for i in range(p.contents.value):
...
rs[0]