#include <iostream>
#include <Python.h>
using namespace std;
void HelloWorld();
void Add();
void TestTransferDict();
void TestClass();
int main()
{
cout << "Starting Test..." << endl;
cout << "HelloWorld()-------------" << endl;
HelloWorld();
cout << "Add()--------------------" << endl;
Add();
cout << "TestDict-----------------" << endl;
TestTransferDict();
cout << "TestClass----------------" << endl;
TestClass();
system( "pause" );
return 0 ;
}
/ / 調用輸出 "Hello World" 函數
void HelloWorld()
{
Py_Initialize(); / / 使用python之前,要調用Py_Initialize();這個函數進行初始化
PyObject * pModule = NULL; / / 聲明變量
PyObject * pFunc = NULL; / / 聲明變量
pModule = PyImport_ImportModule( "Test001" ); / / 這裏是要調用的Python文件名
pFunc = PyObject_GetAttrString(pModule, "HelloWorld" ); / / 這裏是要調用的函數名
PyEval_CallObject(pFunc, NULL); / / 調用函數,NULL表示參數爲空
Py_Finalize(); / / 調用Py_Finalize,這個和Py_Initialize相對應的.
}
/ / 調用Add函數,傳兩個 int 型參數
void Add()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule( "Test001" ); / / Test001:Python文件名
pFunc = PyObject_GetAttrString(pModule, "add" ); / / Add:Python文件中的函數名
/ / 創建參數:
PyObject * pArgs = PyTuple_New( 2 ); / / 函數調用的參數傳遞均是以元組的形式打包的, 2 表示參數個數
PyTuple_SetItem(pArgs, 0 , Py_BuildValue( "i" , 5 )); / / 0 - - - 序號 i表示創建 int 型變量
PyTuple_SetItem(pArgs, 1 , Py_BuildValue( "i" , 7 )); / / 1 - - - 序號
/ / 返回值
PyObject * pReturn = NULL;
pReturn = PyEval_CallObject(pFunc, pArgs); / / 調用函數
/ / 將返回值轉換爲 int 類型
int result;
PyArg_Parse(pReturn, "i" , &result); / / i表示轉換成 int 型變量
cout << "5+7 = " << result << endl;
Py_Finalize();
}
/ / 參數傳遞的類型爲字典
void TestTransferDict()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule( "Test001" ); / / Test001:Python文件名
pFunc = PyObject_GetAttrString(pModule, "TestDict" ); / / Add:Python文件中的函數名
/ / 創建參數:
PyObject * pArgs = PyTuple_New( 1 );
PyObject * pDict = PyDict_New(); / / 創建字典類型變量
PyDict_SetItemString(pDict, "Name" , Py_BuildValue( "s" , "WangYao" )); / / 往字典類型變量中填充數據
PyDict_SetItemString(pDict, "Age" , Py_BuildValue( "i" , 25 )); / / 往字典類型變量中填充數據
PyTuple_SetItem(pArgs, 0 , pDict); / / 0 - - - 序號 將字典類型變量添加到參數元組中
/ / 返回值
PyObject * pReturn = NULL;
pReturn = PyEval_CallObject(pFunc, pArgs); / / 調用函數
/ / 處理返回值:
int size = PyDict_Size(pReturn);
cout << "返回字典的大小爲: " << size << endl;
PyObject * pNewAge = PyDict_GetItemString(pReturn, "Age" );
int newAge;
PyArg_Parse(pNewAge, "i" , &newAge);
cout << "True Age: " << newAge << endl;
Py_Finalize();
}
/ / 測試類
void TestClass()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule( "Test001" ); / / Test001:Python文件名
pFunc = PyObject_GetAttrString(pModule, "TestDict" ); / / Add:Python文件中的函數名
/ / 獲取Person類
PyObject * pClassPerson = PyObject_GetAttrString(pModule, "Person" );
/ / 創建Person類的實例
PyObject * pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL);
/ / 調用方法
PyObject_CallMethod(pInstancePerson, "greet" , "s" , "Hello Kitty" ); / / s表示傳遞的是字符串,值爲 "Hello Kitty"
Py_Finalize();
}
|