1、首先介绍下Python安装,登录https://www.python.org/downloads/,下载自己需要的版本下载进行安装,我下载的是3.7.3。安装需要注意,需要使用Debug版本进行编译的,需要在安装时勾对应选项:


2、安装完毕之后进行vs配置
(1)新建c++工程此处不做介绍。
(2)新建工程完毕,进行python路径配置。右键工程-属性:(此处我配置的是Debug、Win32平台,所以需要安装python_x86安装包,如果你想使用x64编译,必须安装Python_x64安装包,否则编译会报错,我安装了python两个版本,这两个版本是兼容的。)



(3)配置完毕可以开始进行编码:
1)建立python文件,文件名为PythonTest.py,python文件内容为:

def Test_add(a,b):return a+b

2)在c++文件的 main函数中写入如下代码(也是在网上学习的,部分代码我有注释,程序仍可以正常运行):

 //此处代码我进行注释,个人认为电脑安装python,设有系统环境变量,此处应该可以省略,但是如果部署电脑不安装python,应该需要进行配置,此处还未验证,后续会更新。//CString PythonPath = _T("C:\Programs\Python37-32");//Py_SetPythonHome(PythonPath);//配置python3的环境变量Py_Initialize();    // 初始化// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性CString path = _T("E:\\work\\SLGEM\\output\\Debug");PyRun_SimpleString(_T("import sys"));PyRun_SimpleString(path);//PyRun_SimpleString("import sys");//PyRun_SimpleString("sys.path.append('C:/Users/Shen/Desktop/TestPython/TestPython/Debug')");// 加载模块PyObject* pModule = PyImport_ImportModule("PythonTest");//此处是python文件名if (!pModule) // 加载模块失败{return ;}// 加载函数PyObject* pv = PyObject_GetAttrString(pModule, "Test_add");//此处是python文件中的函数名称if (!pv || !PyCallable_Check(pv))  // 验证是否加载成功{return ;}// 设置参数PyObject* args = PyTuple_New(2);   // 2个参数//构建两个参数PyTuple_SetItem(args, 0, Py_BuildValue("i", 8));//0--序号,i表示创建int型变量PyTuple_SetItem(args, 1, Py_BuildValue("i", 6));//1--序号,i表示创建int型变量// 调用函数PyObject* pRet = PyObject_CallObject(pv, args);//将返回值转换为int类型int result;PyArg_Parse(pRet, "i", &result);//i表示转换成int型变量cout << "6 + 8 = " << result << endl;Py_Finalize();

3)上面代码注释中有提到,第2)步编译没有问题之后,需要把python文件拷贝到与应用程序(.exe)同目录下,程序才能正常运行。
4)将Python37_d.dll拷贝到与应用程序
.exe)同目录下,程序才能正常运行,此文件在python安装目录下。(此处根据你自己编译的版本决定,如release,需要拷贝Python37.dll)。
5)至此,完成c++调用python的配置调用。本人也是在网上学习,查看了好几个介绍,然后进行整理,方便自己以后学习。
6)以上只是实现了c++调用python的多个参数传递,下面实现list(数组)传递方式:

 Py_Initialize();    // 初始化// 加载模块PyObject* pModule = PyImport_ImportModule("PythonTest");if (!pModule) // 加载模块失败{return ;}// 加载函数PyObject* pv = PyObject_GetAttrString(pModule, "Test_add");if (!pv || !PyCallable_Check(pv))  // 验证是否加载成功{return ;}// 设置参数PyObject* args = PyTuple_New(2);   // 2个参数//两个入参分别为 x,y 数组,大小为3PyObject* pyListX = PyList_New(3);PyObject* pyListY = PyList_New(3);for(int i=0; i<3; i++){PyList_SetItem(pyListX, i,  PyFloat_FromDouble(i));        PyList_SetItem(pyListY, i,  PyFloat_FromDouble(i+1));}//构建两个参数PyTuple_SetItem(args, 0, pyListX);//0--序号,i表示创建int型变量PyTuple_SetItem(args, 1, pyListY);//1--序号,i表示创建int型变量// 调用函数PyObject* pRet = PyObject_CallObject(pv, args);//检查是否为List对象if(PyList_Check(pRet )){ int SizeOfList = PyList_Size(pRet );//List对象的大小,这里SizeOfList = 3for(int i = 0; i < SizeOfList; i++){PyObject *ListItem = PyList_GetItem(pRet, i);//获取List对象中的每一个元素double result = PyFloat_AsDouble(ListItem);//将python中返回的list元素转换doublePyArg_Parse(ListItem, "f", &result);//f表示转换成int型变量,另外一种转换方法//下面注释部分表示,如果返回的是一个二维list,需要进一步获取子元素list的大小,然后循环获取子元素list中的元素,进行转换,本例子返回一维list,所以此处注释。//int NumOfItems = PyList_Size(ListItem);//List对象子元素的大小//for(int Index_k = 0; Index_k < NumOfItems; Index_k++)//{//PyObject *Item = PyList_GetItem(ListItem, Index_k);//遍历List对象中子元素中的每个元素//double value= PyFloat_AsDouble(Item); //输出元素//Py_DECREF(Item); //释放空间//}Py_DECREF(ListItem); //释放空间}}Py_Finalize();

实例下载:https://download.csdn.net/download/shenhch/11262434

c++调用Python详解,及实例相关推荐

  1. C语言递归函数(递归调用)详解[带实例演示]

    一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数.执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出. 递归函数不是C语言的专 ...

  2. python中递归函数的实例_Python 递归函数详解及实例

    Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是 ...

  3. python随机数程序源码_Python 实现随机数详解及实例代码

    Python3实现随机数 random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Pyth ...

  4. python strip和split_python strip() 函数和 split() 函数的详解及实例

    python strip() 函数和 split() 函数的详解及实例 一直以来都分不清楚strip和split的功能,实际上strip是删除的意思:而split则是分割的意思.因此也表示了这两个功能 ...

  5. 简述python文件操作_Python 文件操作的详解及实例

    Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. ...

  6. python调用包的路径_Python3 模块、包调用路径详解

    如下所示: ''' 以下代码均为讲解,不能实际操作 ''' ''' 博客园 Infi_chu ''' ''' 模块的优点: 1.高可维护性 2.可以大大减少编写的代码量 模块一共有三种: 1.Pyth ...

  7. jQuery数组处理详解(含实例演示)

    jQuery的数组处理,便捷,功能齐全. 最近的项目中用到的比较多,深感实用,一步到位的封装了很多原生js数组不能企及的功能. 最近时间紧迫,今天抽了些时间回过头来看 jQuery中文文档 中对数组的 ...

  8. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

  9. python input与返回值-Python 详解基本语法_函数_返回值

    Python 详解基本语法 概要: 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返回给程序再由程序作出进一步的操作.可以说是函数的返回值令 ...

最新文章

  1. 如何使用阿里云服务器
  2. Jenkins中的邮件设置
  3. 2016 - 1 - 19NSOpertation的依赖关系和监听
  4. 华为p50预计售价鸿蒙是什么,华为P50pro预计售价多少 华为P50Pro参数配置
  5. SQLiteOpenHelper使用详解
  6. 第六章 副词(Les adverbes )
  7. jsp中${}的意思--之EL表达式
  8. STC学习:扫描频率可变的电子钟
  9. mybatis-spring-struts2整合
  10. springboot的底层注解【详细】
  11. 纯干货内容:关于ivx和mendix的对比 还在犹豫选择那个低代码平台的小伙伴看过来
  12. Google Guice
  13. 圈的ramsey数研究
  14. 如何关闭vue的语法检查
  15. 织梦5.7登陆注册实现
  16. 计算机专业答辩系统抄袭怎么办,计算机毕业设计答辩怎么老是不过?
  17. 南昌治疗糖尿病的专科医院
  18. Ghost系统前的配置方法大全
  19. 网络编程及socket模块
  20. js base64加密 java base64解密_JS base64 加密和 后台 base64解密(防止中文乱码)

热门文章

  1. Oracle-OGG trail 文件大小引起的进程异常 OGG-01172
  2. scribd.com文档下载
  3. leetcode 61 旋转链表 c++
  4. OnInit和OnLoad
  5. 记一次生产大对象导致的OOM让架构师连夜排查解决
  6. 《海盗派测试分析》笔记-01 了解测试任务 KYM
  7. 8、什么是响应式设计?响应式设计的基本原理是什么?如何做?
  8. 为什么理科男喜欢皈依佛门?
  9. opencv 彩色图像对比度增强
  10. 微型计算机DEC影响零标志位吗,汇编语言中常用指令对标志位寄存器的影响