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
- C++调用Python(需要安装Python)
- 【Python】python调用C程序
- BCB(C++)调用Python
- C中调用PYTHON
- C调用python
- C调用python
- Python 调用 C函数
- python调用c
- Python 调用C
- c中调用python
- Python调用c/c++
- c 调用python
- python 调用 c 函数
- python调用C函数库
- Python调用C
- Python调用C/C++
- Python调用C程序
- python调用c/c++
- 长轮询(long-polling)
- Linux 如何挂载、卸载硬盘--以centos系统为例
- 链表的操作
- CleanCode
- lodop打印控件破解思路详解(一)
- C++调用Python(需要安装Python)
- iOS - Your build settings specify a provisioning profile with the UUID, no provisioning profile was
- jfreechart做报表分析
- nodejs中流(stream)的理解
- Switch Game(求因子个数)
- Manacher算法(O(n)求最大回文字串的长度)(HDU3068)
- 南方精良系统-不完全版
- 多任务(3)
- iOS开发便捷宏收集