Python的C/C++擴展之Python直接調用科大訊飛語音識別動態庫
05-01
Python作為一門腳本語言有著非常好的易用性,但是很多人會病垢或糾結它的性能,不過Python與C/C++有著很好的溝通,很多對性能要求高的演算法都可以用C/C++實現後供Python調用。
Python通過C/C++進行擴展有很多方法:
直接調用動態庫.so
CPython使用C語言API編寫模塊include
使用boost_python封裝C++類
使用SWIG擴展Python
本文(微信號「一再學習」)以Python使用科大訊飛語言識別的Linux介面來介紹Python如何調用動態庫.so文件。
1. Linux下生成動態庫.so文件
以下是c實現的一個簡單函數(mylib.c):
extern "C" { int sum(int a, int b) { return a+b; }}
在shell中執行如下命令就會得到mylib.so動態庫:
g++ -fPIC -shared -o libmylib.so mylib.c2. 使用Python調用動態庫
#! /usr/bin/env python
import ctypesimport osmylib = ctypes.CDLL(os.getcwd() + /libmylib.so)print mylib.sum(2,6)
3. Python調用科大訊飛語音識別API
載入動態庫:
xflib = ctypes.cdll.LoadLibrary(msc/libmsc.so)在Python裡面調用C函數時主要是注意參數的類型。語音識別的介面如下:
介面函數:const char* MSPAPI QISRSessionBegin( const char* grammarList, const char*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的更詳細說明可以參考官方文檔
題圖來自可免費用於商業用途的圖片共享網站pixabay
推薦閱讀: