1. next, next, ... 配置好环境变量
2. 安装后, xxxx\Python27下有include和libs目录, C++需要包含这些东西, 按自己喜欢的方式添加到C++工程即可.
创建文件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
// 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. 这种异构构建过程是按照一定的规律的, 我们可以对这些接口在封装一下, 提高开发效率.