在一個(gè)C++應(yīng)用程序中,我們可以用一組插件來實(shí)現(xiàn)一些具有統(tǒng)一接口的功能,一般插件都是使用動態(tài)鏈接庫實(shí)現(xiàn),如果插件的變化比較頻繁,我們可以使用Python來代替動態(tài)鏈接庫形式的插件(堪稱文本形式的動態(tài)鏈接庫),這樣可以方便地根據(jù)需求的變化改寫腳本代碼,而不是必須重新編譯鏈接二進(jìn)制的動態(tài)鏈接庫。靈活性大大的提高了。
通過C++調(diào)用Python腳本主要要用到如下的一些Python提供的API,因?yàn)閷?shí)際上C++要調(diào)用的是Python的解釋器,而Python解釋器本質(zhì)就是實(shí)現(xiàn)在動態(tài)鏈接庫里面的,因此在調(diào)用前和調(diào)用后要進(jìn)行一些初始化和資源釋放的工作,另外,要調(diào)用Python腳本里面的函數(shù)等等東西,需要Python提供的一些特殊API來包裝C++調(diào)用。(可以參考[2])。
void Py_Initialize(void)
初始化Python解釋器,如果初始化失敗,繼續(xù)下面的調(diào)用會出現(xiàn)各種錯(cuò)誤,可惜的是此函數(shù)沒有返回值來判斷是否初始化成功,如果失敗會導(dǎo)致致命錯(cuò)誤。
int Py_IsInitialized(void)
檢查是否已經(jīng)進(jìn)行了初始化,如果返回0,表示沒有進(jìn)行過初始化。
void Py_Finalize()
反初始化Python解釋器,包括子解釋器,調(diào)用此函數(shù)同時(shí)會釋放Python解釋器所占用的資源。
int PyRun_SimpleString(const char *command)
實(shí)際上是一個(gè)宏,執(zhí)行一段Python代碼。
PyObject* PyImport_ImportModule(char *name)
導(dǎo)入一個(gè)Python模塊,參數(shù)name可以是*.py文件的文件名。類似Python內(nèi)建函數(shù)import。
PyObject* PyModule_GetDict( PyObject *module)
相當(dāng)于Python模塊對象的__dict__屬性,得到模塊名稱空間下的字典對象。
PyObject* PyRun_String(const char* str, int start,PyObject* globals, PyObject* locals)
執(zhí)行一段Python代碼。
int PyArg_Parse(PyObject* args, char* format, ...)
把Python數(shù)據(jù)類型解析為C的類型,這樣C程序中才可以使用Python里面的數(shù)據(jù)。
PyObject* PyObject_GetAttrString(PyObject *o, char*attr_name)
返回模塊對象o中的attr_name 屬性或函數(shù),相當(dāng)于Python中表達(dá)式語句,o.attr_name。
PyObject* Py_BuildValue(char* format, ...)
和PyArg_Parse剛好相反,構(gòu)建一個(gè)參數(shù)列表,把C類型轉(zhuǎn)換為Python對象,使得Python里面可以使用C類型數(shù)據(jù)。
PyObject* PyEval_CallObject(PyObject* pfunc, PyObject*pargs)
此函數(shù)有兩個(gè)參數(shù),而且都是Python對象指針,其中pfunc是要調(diào)用的Python 函數(shù),一般說來可以使用PyObject_GetAttrString()獲得,pargs是函數(shù)的參數(shù)列表,通常是使用Py_BuildValue()來構(gòu)建。
新聞熱點(diǎn)
疑難解答