在c++中調用python指令碼函數的代碼架構如下: 1 Py_Initialize(); //初始化 python interpreter
2
3 PyObject *pName = PyString_FromString("test1"); // python指令檔名
5 PyObject *pModule = PyImport_Import(pName); // import 指令碼,返回pModule
// pModule指向這個指令碼對象
7 if ( !pModule )
8{
9 cout<<"Can't find the file!"<<endl;
10 return 0;
11 }
12
14 cout<<"Get the function in .py"<<endl;
15 PyObject *pDict = PyModule_GetDict(pModule); // 通過pModule得到dictionary
// 的指標pDict
16 PyObject *pFunc = PyDict_GetItemString(pDict,"Add"); // 通過pDict得到你所需的
// function,此處"Add"為test1.py
// 的一個funciton object
17 PyObject *pParam = PyTuple_New(1); // 填寫function所需要的參數
18 PyObject *pCurParam = PyInt_FromLong(10);
19 PyTuple_SET_ITEM(pParam,0,pCurParam);
20 PyObject *pAdded = PyObject_CallObject(pFunc,pParam);// 調用此function,並得到
// 傳回值
21 int max = PyInt_AsLong(pAdded); // 將傳回值轉換為c++的資料類型
22 cout<<"after added ,the number is "<<max<<endl;
23
24 Py_XDECREF(pAdded); // 引用計數減一
25 Py_XDECREF(pCurParam);
26 Py_XDECREF(pParam);
27// Py_XDECREF(pFunc);
28// Py_XDECREF(pDict);
29 Py_XDECREF(pModule);
30 Py_XDECREF(pName);
31
32 Py_Finalize(); // 關閉 python interpreter
這裡有幾個問題,目前還沒有解決:
1). 我使用的是python25_d.dll,無法找到用activepython編輯的*.py檔案中的function object 。我的activepython版本為2.4。
2). 程式末尾不能將 function object 和 dictionary object 的引用計數減一,如果執行此操作,程式會crash。