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



一. 安装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 + b

def TestDictionary(dict):
    print dict
    dict["Size"] = 100
    return dict

class 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. 这种异构构建过程是按照一定的规律的, 我们可以对这些接口在封装一下, 提高开发效率.

你可能感兴趣的:(C++,python,调用)