使用Ctypes进行python和C++strings类型返回值交互遇到的问题以及隐藏bug
使用C++加速python代码中比较耗时的地方,需要遇到的python和C++交互的问题。交互方式有使用boost库里面的Boost::Python,C++的python API :include<Python.h> 等,这里用的是Ctypes调用C++编译的so包方式进行交互。
C++入参,出参是数组的时候没有遇到什么大问题,但是C++函数返回值是string类型,其中包含中文的时候,会出现各种问题,比如python获取C++返回的数字英文正常,中文就是乱码或者不全,或者获取的是一直在变动的地址。
主要解决思路就是使用
sss.c_str()
将C++的string类型 转换为C语言的 const char*数据类型。在python的代码中使用
func.restype = ctypes.c_char_p
设置为字符指针,获取到的C++返回值后再用str()方法进行decode即可。
至此,里面会有一个隐藏的bug ,sss.c_str()方法,最后返回的结果有时会出现为空的现象(遇到这个问题,费劲才定位到。。sss对象已经被析构?)不明所以。。这时候新定义一个静态的char c ,(函数执行完不会被释放)使用
strcpy(c,sss.c_str())
拷贝出来再作为返回值即可,注意 此时函数返回类型从 const char* 变为 char*。