此处是一些延伸补充。先简单列一下:
1, python中的字符串是string类型,无法更改,若c的api函数需要传入字符串并进行更改,需使用ctypes使用的create_string_buffer进行转换
eg:
c端动态库有一个函数,func_name(char * pName),
在python端调用,func_name("Alex"),会提示<class 'TypeError'>: wrong type
因为python中字符串无法更改,需要转换为可更改类型,若是中文,还需转为bytes型
如:在python端,func_name(create_string_buffer(bytes("Alex", 'utf-8')))
后续查询,python2与python3有区别,暂未深究,此处只做个标记
2,我使用的场景很多是处理图像数据,转换类型多是bytes且内容长,不方便通用类型转换,此时可借助numpy和numpy.ndarray.ctypes进行辅助转换。
参考文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.ctypes.html
c部分代码:
/**
* param in:
* pRgb 图片的rgb数组
*/
int needRgb(unsigned char *pRgb, int nWidthIn,int nHeightIn)
{
....
}
若python中使用通用类型转换,需获取图片大小、转换像素点等,操作复杂。借助numpy等模块可快速转换。
python端代码:
...
import cv2
# cv2读取图片
image_path = "xxxx/xxx.jpg"
img = cv2.read(image_path)
img_rgb = img.transpose(2, 1, 0) # 默认bgr,转为rgb
# 声明、调用动态库函数
library.needRgb.argtypes = [POINTER(c_ubyte), c_int, c_int]
library.needRgb.retypes = c_int
#buf_np = numpy.asarray(img_rgb)
buf_ctypes = img_rgb.ctypes.data_as(POINTER(c_ubyte))
library.needRgb(buf_ctypes, ....)
3,
假设有动态库libDemo.so, 内部实现了func_demo。
该动态库链接了其余动态库libAAA.so,libAAA.so中实现了函数func_AAA。
则python调用动态库libDemo.so,也可调用func_AAA函数。注意程序需能找到libDemo.so和libAAA.so的位置。