在瞭解下面的函數以前有必要了解一下**PyObject***指針,python裏面幾乎全部的對象都是使用這個指針來指示的。python
在調用任何python的c函數以前須要調用的函數,「Py_Initialize」是用來初始化python模塊的,推測是加載初始化加載dll的。對應的在使用python模塊以後用「Py_Finalize」來釋放模塊。ios
用來載入一個python模塊,這個模塊就是通常的python文件。這裏須要注意的是,在加載這個模塊的時候會執行模塊裏面全部能夠執行的語句。包括import導入語句和在函數體以外的全部語句c++
返回模塊裏面的函數api
創建一個參數元組,通常都是用這個函數來創建元組,而後將這個元組做爲參數傳遞給python裏面的函數。函數
調用函數,並把「Py_BuildValue」創建的元組做爲參數傳遞給被調用的函數ui
下面的實例是在c++代碼中調用Python的函數,傳遞參數而且獲取返回值spa
test.cpp代碼指針
#include <iostream> #include <Python.h> 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代碼code
def main(szString): return ("hello", 5)