C++调用Python
// CallPython.cpp : 定义控制台应用程序的入口点。//
#include "stdafx.h"
#include "Python.h"
#include <iostream>
using namespace std;
void TestCallFunc();
void TestCallFuncDict();
void TestClass();
int _tmain(int argc, _TCHAR* argv[])
{
TestCallFunc();
TestCallFuncDict();
TestClass();
getchar();
return 0;
}
void TestCallFunc()
{
Py_Initialize();// 使用Python之前,要调用Py_Initialize初始化
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
PyObject* pAddFunc = NULL;
pModule = PyImport_ImportModule("testPython");// 加载模块,加载py文件
if (pModule)
{
// 加载函数,HelloWorld,无参数
pFunc = PyObject_GetAttrString(pModule, "HelloWorld");// 获取模块的函数
if (pFunc)
{
PyEval_CallObject(pFunc, NULL);// 调用函数,NULL表示参数为空
//Py_DECREF(pFunc);
}
else
{
cout << "pFunc = NULL" << endl;
}
// 加载函数,Add,两个参数
pAddFunc = PyObject_GetAttrString(pModule, "add");
if (pAddFunc)
{
// 创建参数
PyObject* pArgs = PyTuple_New(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(pAddFunc, pArgs);
// 传入多个参数
//pReturn = PyEval_CallFunction(pAddFunc, "ii", 5, 7);
pReturn = PyObject_CallFunction(pAddFunc, "ii", 5, 7);
// 将返回值转为int类型
int result;
PyArg_Parse(pReturn, "i", &result);
cout << "5 + 7 = " << result << endl;
//Py_DECREF(pAddFunc);
}
else
{
cout << "pAddFunc = NULL" << endl;
}
}
else
{
cout << "pModule = NULL" << endl;
}
//Py_DECREF(pModule);
Py_Finalize();// 释放
}
void TestCallFuncDict()
{
Py_Initialize();
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
pModule = PyImport_ImportModule("testPython");
if (pModule)
{
pFunc = PyObject_GetAttrString(pModule, "TestDict");
if (pFunc)
{
// 设置参数字典
PyObject* pArgs = PyTuple_New(1);
PyObject* pDict = PyDict_New();
PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "Longma"));
PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25));
PyTuple_SetItem(pArgs, 0, pDict);
PyObject* pReturn = PyEval_CallObject(pFunc, pArgs);
// 处理返回值
int size = PyDict_Size(pReturn);
cout << "返回字典的大小为:" << size << endl;
PyObject* pNewAge = PyDict_GetItemString(pReturn, "Age");
int newAge = _PyInt_AsInt(pNewAge);
//PyArg_Parse(pNewAge, "i", &newAge);
cout << "True Age: " << newAge << endl;
PyObject* pNewName = PyDict_GetItemString(pReturn, "Name");
char* pName = PyString_AsString(pNewName);
cout << "True Name: " << pName << endl;
//Py_DECREF(pFunc);
}
}
Py_Finalize();
}
void TestClass()
{
Py_Initialize();
PyObject* pModule = NULL;
pModule = PyImport_ImportModule("testPython");
if (pModule)
{
// 获取Person类
PyObject* pClassPerson = PyObject_GetAttrString(pModule, "Person");
// 创建Person类实例
PyObject* pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL);
// 调用方法greet方法
PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty");
// 传入多个参数
//PyObject_CallMethod(pInstancePerson, "greet", "si", "Hello Kitty", 10);
}
Py_Finalize();
}
页:
[1]