C++调用Python(需要安装Python)

来源:互联网 发布:网络大电影投资合同 编辑:程序博客网 时间:2024/06/07 05:10


一. 安装Python2.7.9


1. next, next, ... 配置好环境变量
2. 安装后, xxxx\Python27下有include和libs目录, C++需要包含这些东西, 按自己喜欢的方式添加到C++工程即可.


二. 你的Python代码


创建文件Test001.py
代码如下:

#-*- coding:utf-8 -*-def HelloWorld():    print "Hello World"def Add(a, b):    return a + bdef TestDictionary(dict):    print dict    dict["Size"] = 100    return dictclass Person:    def SayHi(self, strName):        print "Hi " + strName


三. C++的调用代码(VC2008)

// TestCallPy.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>  #include <Python.h>// 调用一个没有参数, 没有返回值的函数, void TestHelloWorld(){      PyObject * pModule = PyImport_ImportModule("Test001");// 导入模块(注意不是Test001.py)    PyObject * pFunc = PyObject_GetAttrString(pModule, "HelloWorld");   // 加载模块中的函数    PyEval_CallObject(pFunc, 0);// 调用函数(没有参数, 没有返回值的函数)    Py_Finalize();                // 释放Python环境}    // 调用一个有参数, 有返回值的函数void TestAdd(int a, int b){      Py_Initialize();// 初始化Python环境    if(0 == Py_IsInitialized())// 检查初始化是否成功    {return;    }      PyObject * pModule = PyImport_ImportModule("Test001");// 导入模块(注意不是Test001.py)    PyObject * pFunc = PyObject_GetAttrString(pModule, "Add");// 加载模块中的函数// 创建参数    PyObject *pArgs = PyTuple_New(2);// 函数调用的参数传递均是以元组的形式打包的, 2表示参数个数      PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", a));// 0---序号  i 表示创建int型变量      PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", b));// 1---序号      PyObject *pReturn = PyEval_CallObject(pFunc, pArgs);// 调用函数  // 获取返回值    int nResult;      PyArg_Parse(pReturn, "i", &nResult);// 注意类型对应      Py_Finalize();// 释放Python环境}    // 参数传递的类型为字典  void TestDictionary()  {      Py_Initialize();// 初始化Python环境    if(0 == Py_IsInitialized())// 检查初始化是否成功    {return;    }      PyObject * pModule = PyImport_ImportModule("Test001");// 导入模块(注意不是Test001.py)    PyObject * pFunc = PyObject_GetAttrString(pModule, "TestDictionary");// 加载模块中的函数// 创建一个字典变量    PyObject *pDict = PyDict_New();// 创建字典类型变量      PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "Bar"));// 往字典类型变量中填充数据      PyDict_SetItemString(pDict, "Size", Py_BuildValue("i", 25));// 往字典类型变量中填充数据 // 创建参数:  PyObject *pArgs = PyTuple_New(1);       PyTuple_SetItem(pArgs, 0, pDict);// 0---序号 将字典类型变量添加到参数元组中// 调用函数    PyObject *pReturn = PyEval_CallObject(pFunc, pArgs);// 获取返回值    int nDictSize = PyDict_Size(pReturn);// 获取字典的大小// 获取字典中Size项    PyObject *pSize = PyDict_GetItemString(pReturn, "Size");// 获取字典的某一个项      int nSize;      PyArg_Parse(pSize, "i", &nSize);    Py_Finalize();                  }    // 调用类 void TestClass()  {      Py_Initialize();// 初始化Python环境    if(0 == Py_IsInitialized())// 检查初始化是否成功    {return;    }      PyObject * pModule = PyImport_ImportModule("Test001");// 导入模块(注意不是Test001.py)    PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person");// 导入类// 创建Person类的对象     PyObject *pInstancePerson = PyInstance_New(pClassPerson, 0, 0);    // 调用对象的方法      PyObject_CallMethod(pInstancePerson, "SayHi", "s", "Jack");// s表示传递的是字符串,值为"Hello Kitty"        Py_Finalize();            }int _tmain(int argc, _TCHAR* argv[]){    TestHelloWorld();      TestAdd(7, 9);      TestDictionary();      TestClass();system("pause");    return 0;  }

四. 小结


1. 这里是自己安装Python环境的, 也可以直接把环境打包好, 而不需要安装Python环境.
2. 这种异构调用, 无非就是使用C++代码调用Python提供的C++接口构建Python调用的过程.(例如加载库, 函数, 构建参数, 函数调用, 获取返回值等等)
3. 这种异构构建过程是按照一定的规律的, 我们可以对这些接口在封装一下, 提高开发效率.

0 0
原创粉丝点击