Python调用c/c++动态库(二)

6 篇文章 0 订阅
4 篇文章 2 订阅

此处是一些延伸补充。先简单列一下:

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的位置。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值