把python嵌入的C++裡面需要做一些步驟
安裝python程式,這樣才能使用python的標頭檔和庫
在我們寫的源檔案中增加“Python.h”標頭檔,並且鏈入“python**.lib”庫(還沒搞清楚這個庫時靜態庫還是匯出庫,需要搞清楚)
掌握和瞭解一些python的C語言api,以便在我們的c++程式中使用
常用的一些C API函數
在瞭解下面的函數之前有必要瞭解一下**PyObject***指標,python裡面幾乎所有的對象都是使用這個指標來指示的。
Py_Initialize()&&Py_Finalize()
在調用任何python的c函數之前需要調用的函數,“Py_Initialize”是用來初始化python模組的,推測是載入初始化載入dll的。對應的在使用python模組之後用“Py_Finalize”來釋放模組。
PyImport_ImportModule()
用來載入一個python模組,這個模組就是一般的python檔案。這裡需要注意的是,在載入這個模組的時候會執行模組裡面所有可以執行的語句。包括import匯入語句和在函數體之外的所有語句
PyObject_GetAttrString()
返回模組裡面的函數
Py_BuildValue()
建立一個參數元組,一般都是用這個函數來建立元組,然後將這個元組作為參數傳遞給python裡面的函數。
PyEval_CallObject()
調用函數,並把“Py_BuildValue”建立的元組作為參數傳遞給被調用的函數
源碼執行個體
下面的執行個體是在c++代碼中調用Python的函數,傳遞參數並且擷取傳回值
test.cpp代碼
#include #include using namespace std;int main(int argc, char* argv[]){ Py_Initialize(); //初始化 PyObject* pModule = NULL; PyObject* pFunc = NULL; PyObject* pParam = NULL; PyObject* pResult = NULL; const char* pBuffer = NULL; int iBufferSize = 0; pModule = PyImport_ImportModule(“test_python"); if (!pModule) { cout << "get module failed!" << endl; exit (0); } pFunc = PyObject_GetAttrString(pModule, "main"); if (!pFunc) { cout << "get func failed!" << endl; cout << int(pFunc) << endl; exit (0); } pParam = Py_BuildValue("(s)", "HEHEHE"); pResult = PyEval_CallObject(pFunc,pParam); if(pResult) { if(PyArg_Parse(pResult, "(si)", &pBuffer, iBufferSize)) { cout << pBuffer << endl; cout << iBufferSize << endl; } } Py_DECREF(pParam); Py_DECREF(pFunc); Py_Finalize(); //cout << "hello" << endl; return 0;}
test_python.py代碼
def main(szString): return ("hello", 5)