13719654321 发表于 2018-8-11 12:37:42

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]
查看完整版本: C++调用Python