C++调用python代码

【需求】:使用c++调用python中sklearn包的SVM,训练+识别。
【需要解决的问题】:相关的环境配置,c++与python数据类型的互转,不安装python的环境下运行。

【测试用的python包】:python2.7.14-32位
【测试用的vs工程】:debug 32位

【步骤】:(具体的示例,在这里
1. 先配置VS的项目属性,一个是包含目录,一个是库目录。
包含目录添加python根目录下的include文件夹;库目录添加python根目录下的Lib文件夹。
lib文件夹里放【python27.lib文件】和【python27_d.lib文件】,我现在debug32位下用的就是【python27_d.lib文件】。

2. 把【python27.dll文件】和C++要调用的【.py文件】都放到工程下debug文件夹下,也就是跟【.exe文件】相同目录下。
当前还有python环境时,【python27.dll文件】在你安装python后的C盘windows\SysWOW64文件夹下。

3. 在vs环境下调试时,需要将Python27文件夹放到调用python代码的【.cpp文件】同目录中;在软件发布后运行时,Python27文件夹放到【.exe文件】相同目录下。

4. C++的代码中添加Python.h头文件。

【使用的几个API函数】:
1. Py_SetPythonHome( "路径")
    设置运行py文件时,搜索依赖文件的路径。
2. Py_Initialize( )和Py_Finalize( )
    成对儿出现,用在调用python的头尾。
3. PyImport_ImportModule("py的文件名")
    纯文件名,不包含".py"这几个字符,返回一个PyObject类型的指针,例如拿PyObject* pModule接收返回值。
4. PyObject_GetAttrString(pModule, "wcyaaa")
    拿到python中函数的索引,上面的pModule放到第一个参数,表示从这个py文件里取数据;后面第二个参数是要调用的python函数的函数名。
    返回一个PyObject类型的指针,例如拿PyObject* pFunc接收返回值。
5. PyEval_CallObject(pFunc, NULL)

    调用pFunc对应的那个python中的函数,上面的pFunc放到第一个参数,表示调用这个函数;后面第二个参数是要传入python函数的参数。这里调用的是无参的函数,就填NULL。
    返回的内容为python函数的返回值,类型仍是PyObject*。
6. PyTuple_New(参数个数)
    如果需要传参数到python函数中,那这里就将“传参个数”设置成对应的数量。传元组就类似C++中的const,不能改。
    返回值同样是PyObject类型的指针,例如拿PyObject *pArgs接收返回值。

7. PyTuple_SetItem(pArgs, 0, variable)
    第一个参数就是负责传递参数的管道,也就是那个元组;第二个参数是这个元组中的第几个元素;第三个参数是要放入元组对应位置的数据(这个需要是 PyObject * )。
    调用函数传参时,就这么写:PyEval_CallObject(pFunc, pArgs)
8. Py_BuildValue("i",variable)
    将C++的数据结构转成python的数据结构。第一个参数是格式设定,第二个参数是待转换的C++变量。
9. PyArg_Parse(pVal, "i", &result)
    将python的数据结构转换成C++的数据结构。第一个参数是接收的python函数的返回值;第二个参数是参数设定;第三个参数是用来接收转换后C++类型的数据。

【不安装python环境运行】:
在运行python程序之前,也就是Py_Initialize( )之前调用一下Py_SetPythonHome( "路径"),把搜索依赖文件的路径设置成Python27文件夹的路径,就ok了。

示例代码里面有很多不足:
比如构造二维嵌套的list时,直接粗暴的13个值塞进去了,其实可以分层来造;

包含的Python27文件夹中文件比较多,回头再精简一下。可根据下面几个博客来尝试提取。
嵌入python的c++程序发布(二)最小化抽取需要的模块 - CSDN博客
C中嵌入Python解释器 - CSDN博客
VS2010 c++内嵌python环境以及生成发布安装包 - CSDN博客
嵌入python的c++程序发布(一)最简单的方法 - CSDN博客

猜你喜欢

转载自blog.csdn.net/wcybrain/article/details/80250910