C/C++扩展之Python直接调用讯飞语言

python作为一门脚本语言有着非常好的易用性,但是很多人会病垢或纠结它的性能,不过python与c/c++有着很好的沟通,很多对性能要求高的算法都可以用c/c++实现后供python调用。
python通过c/c++进行扩展有很多方法:
直接调用动态库.socpython使用c语言api编写模块include使用boost_python封装c++类使用swig扩展python
以python使用科大讯飞语言识别的linux接口来介绍python如何调用动态库.so文件。
1.linux下生成动态库.so文件
以下是c实现的一个简单函数(mylib.c):
externc{
intsum(inta,intb){
returna+b;
}
在shell中执行如下命令就会得到mylib.so动态库:
g++-fpic-shared-olibmylib.somylib.c
2.使用python调用动态库
#!/usr/bin/envpython
importctypes
importos
mylib=ctypes.cdll(os.getcwd()+'/libmylib.so')
printmylib.sum(2,6)
3.python调用科大讯飞语音识别api
加载动态库:
xflib=ctypes.cdll.loadlibrary('msc/libmsc.so')
在python里面调用c函数时主要是注意参数的类型。语音识别的接口如下:
接口函数:
constchar*mspapiqisrsessionbegin(constchar*grammarlist,constchar*
params,int*errorcode)
返回的是一个char指针作为sessionid以供后续接口使用,在python里面要用ctypes.c_voidp类型:
ret=ctypes.c_int()
sessionid=ctypes.c_voidp()
sessionid=xflib.qisrsessionbegin(none,param1,ret)
调用其它接口函数时,还可能用到如下ctypes的类型和接口:
ctypes.create_string_buffer()ctypes.addressof()ctypes.byref()ctypes.string_at()ctypes.c_char_p()ctypes.c_uint()
关于ctypes的更详细说明可以参考官方文档