c++和Python混合编程
来源:互联网 发布:linux查看centos版本 编辑:程序博客网 时间:2024/05/29 14:28
1. 设置环境
1) 在vs的附加包含目录中添加Python的include路径;
2) 在vs Linker的附加库目录中添加python的libs路径;
3) 注意,如果安装的python是64位的,那么vs工程也要是一直对应的x64活动平台,否则会报“无法解析的外部符号 __imp__Py_Initialize”等错误
4) 如果没设置pythonpath,需要在调用Py_SetPythonHome()之前,设置python搜索路径, Py_SetPythonHome("C:\Python27");
2. coding
#include <iostream> #include <Python.h> using namespace std; void HelloWorld(); void Add(); void TestTransferDict(); void TestClass(); int main() { cout << "Starting Test..." << endl; cout << "HelloWorld()-------------" << endl; HelloWorld(); cout << "Add()--------------------" << endl; Add(); cout << "TestDict-----------------" << endl; TestTransferDict(); cout << "TestClass----------------" << endl; TestClass(); system("pause"); return 0; } //调用输出"Hello World"函数 void HelloWorld() { Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化 PyObject * pModule = NULL;//声明变量 PyObject * pFunc = NULL;//声明变量 pModule =PyImport_ImportModule("Test001");//这里是要调用的Python文件名 pFunc= PyObject_GetAttrString(pModule, "HelloWorld"); //这里是要调用的函数名 PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空 Py_Finalize();//调用Py_Finalize,这个和Py_Initialize相对应的. } //调用Add函数,传两个int型参数 void Add() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule =PyImport_ImportModule("Test001");//Test001:Python文件名 pFunc= PyObject_GetAttrString(pModule,"add");//Add:Python文件中的函数名 //创建参数 PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,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(pFunc, pArgs);//调用函数 //将返回值转换为int类型 int result; PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量 cout << "5+7 = " << result << endl; Py_Finalize(); } //参数传递的类型为字典 void TestTransferDict() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule =PyImport_ImportModule("Test001");//Test001:Python文件名 pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名 //创建参数: PyObject *pArgs = PyTuple_New(1); PyObject *pDict = PyDict_New(); //创建字典类型变量 PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典类型变量中填充数据 PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据 PyTuple_SetItem(pArgs, 0, pDict);//0---序号将字典类型变量添加到参数元组中 //返回值 PyObject *pReturn = NULL; pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数 //处理返回值: int size = PyDict_Size(pReturn); cout << "返回字典的大小为: " << size << endl; PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age"); int newAge; PyArg_Parse(pNewAge, "i", &newAge); cout << "True Age: " << newAge << endl; Py_Finalize(); } //测试类 void TestClass() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule =PyImport_ImportModule("Test001");//Test001:Python文件名 pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名 //获取Person类 PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person"); //创建Person类的实例 PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL); //调用方法 PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty"); //s表示传递的是字符串,值为"Hello Kitty" Py_Finalize(); }上面代码转自:http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html
阅读全文
0 0
- python和C语言混合编程实例
- c++,python混合编程
- python c/c++ 混合编程
- Python C/C++混合编程
- Python和C混合编程时需注意内存泄漏
- 如何发布C和python混合编程的程序
- 一个c/c++和python混合编程的例子
- python和R混合编程
- c++和Python混合编程
- C++和Python混合编程
- c++和Python混合编程
- C和汇编混合编程
- c和C++混合编程
- c++和c混合编程
- C和C++混合编程
- 汇编和c混合编程
- C和C++混合编程
- C和C++混合编程
- SSL证书生成方法
- SparkNET: 用Spark训练深度神经网络
- Sphinx高性能实时索引的解决方案
- 编码问题
- FTP服务器搭建
- c++和Python混合编程
- HTTP 错误 403.14
- 【LeetCode】54. Spiral Matrix
- 【怎样写代码】参数化类型 -- 泛型(八):泛型委托
- draggable属性和dataTransfer对象
- iOS播放系统音频的几种方式
- 一个PID控制理解的误区
- NewPanderKing 抬头是山,路在脚下! LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- Python和R数据挖掘分析技术高级公开课在上海举行