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