1.Python腳本,名稱為py_add.py
def add(a=1,b=1): print('Function of python called!') print('a = ',a) print('b = ',b) print('a + b = ',a+b)
2.C代碼
#include <stdio.h> #include <stdlib.h> #include <Python.h> int main(int argc,char **argv) { //初始化,載入python的擴展模塊 Py_Initialize(); //判斷初始化是否成功 if(!Py_IsInitialized()) { printf("Python init failed!\n"); return -1; } //PyRun_SimpleString 為宏,執行一段python代碼 //導入當前路徑 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); PyObject *pName = NULL; PyObject *pModule = NULL; PyObject *pDict = NULL; PyObject *pFunc = NULL; PyObject *pArgs = NULL; //加載名為py_add的python腳本 pName = PyString_FromString("py_add"); pModule = PyImport_Import(pName); if(!pModule) { printf("Load py_add.py failed!\n"); getchar(); return -1; } pDict = PyModule_GetDict(pModule); if(!pDict) { printf("Can't find dict in py_add!\n"); return -1; } pFunc = PyDict_GetItemString(pDict,"add"); if(!pFunc || !PyCallable_Check(pFunc)) { printf("Can't find function!\n"); getchar(); return -1; } /* 向Python傳參數是以元組(tuple)的方式傳過去的, 因此我們實際上就是構造一個合適的Python元組就 可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等幾個函數 */ pArgs = PyTuple_New(2); // PyObject* Py_BuildValue(char *format, ...) // 把C++的變量轉換成一個Python對象。當需要從 // C++傳遞變量到Python時,就會使用這個函數。此函數 // 有點類似C的printf,但格式不同。常用的格式有 // s 表示字符串, // i 表示整型變量, 如Py_BuildValue("ii",123,456) // f 表示浮點數, // O 表示一個Python對象 PyTuple_SetItem(pArgs,0,Py_BuildValue("i",123)); PyTuple_SetItem(pArgs,1,Py_BuildValue("i",321)); //調用python的add函數 PyObject_CallObject(pFunc,pArgs); //清理python對象 if(pName) { Py_DECREF(pName); } if(pArgs) { Py_DECREF(pArgs); } if(pModule) { Py_DECREF(pModule); } //關閉python調用 Py_Finalize(); return 0; }
3,編譯
gcc -I/usr/include/python2.7/ mian.c -o main -L/usr/lib/ -lpython2.7
備注:鏈接Python的庫需在最后,否則可能會出現以下的錯誤提示:
undefined reference to 'Py_Initialize'
4,運行結果
5.參考文章:C++調用Python淺析 http://blog.csdn.net/magictong/article/details/8947892