用户中心
登录
登陆私有云
Toggle navigation
首页
分类
默认分类
English Novel
技术
机器学习
编程学习
智能家居
碎碎念
人工智能
元宇宙
chatgpt
强化学习
其他页面
whateat
一周Bing美图
书籍搜索网站
Media
OKAI
口红颜色可视化
关于我
关于我
C++调用python基本数据类型实例--锲而不舍的trying
鱼塘里的废柴少女
发布 | 2018-11-01 |
编程学习
| 9437 浏览
![无脸男][1] 继翻译完官方文档之后依然没搞明白到底C++是怎么调用python模块的,于是乎,本废柴少女决定再一次勇敢尝试,悲催的是,又要改项目申请书又要改活动文案,是挣扎在时间夹缝中的努力了!!! 可以当废柴,但躺着当一枚废柴就真的是条咸鱼了。orz ps:本废柴少女不仅废柴,还懒。So直接从我的CSDN账号里原封不动地copy过来了... okay,to be serious now ----------------------------------------------------------------------------------------------------------这是一条严肃的分割线 本篇blog参考了以下多篇博文,贴出来供大家自行学习 [浅析 C++ 调用 Python 模块](https://www.cnblogs.com/findumars/p/6142330.html) [C++调用Python实例](https://blog.csdn.net/u012983289/article/details/55194714) [C++调用Python浅析](https://blog.csdn.net/magictong/article/details/8947892) 其实很多博客已经讲得蛮具体了,但可能我太小白吧所以摸索了很久才差不多弄出来,我就把步骤写得详细一点供大家参考啦~ Okay下面开始 ## 1.新建项目 打开vs2013,新建一个win32控制台项目,命名为**Cpp_calling_pymodel_test**,然后新建一个cpp,命名为**main**(命名都可以自己随便起,这里就以我自己的为栗子吧)。 接下来将**Anaconda3**文件夹(此处python安装包的解压缩文件夹也同理)下的**include**和**libs**两个文件夹拷贝到与**Cpp_calling_pymodel_test.sln** 的同一目录下。 打开**libs** 文件夹,拷贝一份其中的**python36.lib**文件,将其重命名为**python36_d.lib**(之所以重命名的原因是**include**目录下的**pyconfig.h**文件里面的代码在**Debug**模式下调用的是**python36_d.lib**文件),具体可见下面的附图啦 ![工程目录详细](https://img-blog.csdnimg.cn/20181031175822102.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) 文件夹1:**Cpp_calling_pymodel_test**:工程同名文件夹,main.cpp在该文件夹下 文件夹2:**include** :copy from 解压后的**Anaconda3**文件夹 文件夹3:**libs**:copy from 解压后的**Anaconda3**文件夹+1 文件夹4:**x64**平台文件夹,该文件夹下存放着包含**Cpp_calling_pymodel_test.exe**的Debug文件夹,具体为什么要换成**x64**平台在第5小节里会讲到 ## 2.配置属性管理器 **C/C++** -->**常规** -->**附加包含目录** -->添加 **F:\niuke\Cpp_calling_pymodel_test\include** 接着 **链接器**-->**常规**-->**附加库目录**-->添加**F:\niuke\Cpp_calling_pymodel_test\libs** 最后 **链接器**-->**输入**-->**附加依赖项**-->添加**python36_d.lib** 到这儿,属性配置就okay了~ ![属性配置](https://img-blog.csdnimg.cn/2018103017271562.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) ![属性配置](https://img-blog.csdnimg.cn/20181030205009372.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) ![属性配置](https://img-blog.csdnimg.cn/20181030172735989.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) ## 3.其他 将**Anaconda3**文件夹下的**python36.dll**文件拷贝到Debug目录下(与**Cpp_calling_pymodel_test.exe** 同目录)。在该Debug目录下新建一个.txt文件,将其命名为**Test_origin.py**(具体内容详见后面) ![没啥好描述的吧](https://img-blog.csdnimg.cn/20181031180723851.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) ## 4.挂代码 首先,**main.cpp** 接下来我们就要贴代码啦 ``` #include
using namespace std; extern "C" { #include "Python.h" } //调用输出"Hello Python"函数 void Hello() { Py_Initialize();//调用Py_Initialize()进行初始化 PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule = PyImport_ImportModule("Test001");//调用的Python文件名 pFunc = PyObject_GetAttrString(pModule, "Hello");//调用的函数名 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", 6));//0--序号,i表示创建int型变量 PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序号 //返回值 PyObject *pReturn = NULL; pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数 //将返回值转换为int类型 int result; PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量 cout << "6 + 8 = " << result << endl; Py_Finalize(); } int main(int argc, char** argv) { cout << "调用Test001.py中的Hello函数..." << endl; Hello(); cout << "\n调用Test001.py中的Add函数..." << endl; Add(); getchar(); return 0; } ``` 接着 **Test_origin.py** ``` def Hello(): print("Hello Python") def Add(a, b): return a+b ``` 以上代码参考自[C++调用Python实例](https://blog.csdn.net/u012983289/article/details/55194714) 按照此方法我们只是实现了基本变量的跨语言调用,更为复杂的图片和模型调用才是我工作的重中之重啦。后续还会持续更新我的学习进展,大家一起**day day up**~ ----------------------------------------------------------------------------------------------------------这是一条严肃的分割线 ## 5.#悲催的后续 即使是现成的代码,自己跑起来可能也有一堆bug,没有bug什么的,永远都是不可能没有bug的,哭! 运行时可能会出现**error LNK2019: 无法解析的外部符号** 不要慌,可能是平台的问题,比如我就遇到了这个问题,继续哭!我的python是64位的,但我的项目一直是基于32位的platform创建的,所以这里就是改平台的工作啦。 具体可以参考下面两个链接,写得都挺详细的 [C++调用python](https://blog.csdn.net/pipisorry/article/details/49532341) [C++调用python配置及编译出现的问题](http://www.cppblog.com/API/archive/2013/04/25/199720.html) 我就写下我的操作步骤吧 **链接器**-->**高级**-->**目标计算机**-->**MachineX64 (/MACHINE:X64)** ![目标计算机](https://img-blog.csdnimg.cn/20181030222329185.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) 接着工程属性改为**x64**(如下图所示) ![工程属性](https://img-blog.csdnimg.cn/20181030222026756.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) 清理之前的解决方案再次生成就能成功生成**.exe** 文件啦~ 不过不要高兴得太早,因为修改了工程属性,如果你和我一样,一开始使用的都是**win32**平台,那之前的 **\Debug**目录就得要变成 **\x64\Debug**了,oh my dear! 原来的**python36.dll**文件、**Test_origin.py** 文件就得拷贝到现在的Debug目录下了。 ![新的debug文件夹](https://img-blog.csdnimg.cn/20181030223112249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) 也许你会觉得到此,终于no problem了吧。 不! 你可能还会遇到下面这个问题,像我一样,哭! ![坎坷+1](https://img-blog.csdnimg.cn/20181031181545314.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) 不要绝望,我只是加了一句代码就成功解决了这个问题。 ![解决ing](https://img-blog.csdnimg.cn/20181031181815643.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) 加的就是这么一句代码: ``` Py_SetPythonHome(L"D:/Anaconda3"); ``` Okay终于完美解决~ ![调用结果输出](https://img-blog.csdnimg.cn/20181031182018262.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODcwMDkx,size_16,color_FFFFFF,t_70) 终于啊啊啊啊啊,确认了是条废柴没错了。== 后面继续尝试非基本数据类型的调用,比如图像数据,敬请期待本废柴的next tryout,see you~(Wink~) [1]: https://www.domocloud.cn/usr/uploads/2018/06/1471690950.jpg
标签
没有标签
© 著作权归作者所有
本文由 豆末 创作,采用
知识共享署名4.0
国际许可协议进行许可,本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。
微信扫一扫查看
关闭
评论关闭
分类
默认分类
3
English Novel
3
技术
16
机器学习
3
编程学习
2
智能家居
4
碎碎念
9
人工智能
0
元宇宙
2
chatgpt
0
强化学习
0
最新文章
编译 openwrt教程
看不见的城市 - 11-25
数字经济元宇宙之电力元宇宙
看不见的城市 - 05-28
数字经济元宇宙
看不见的城市 - 05-28
智能家居终结篇之元宇宙
看不见的城市 - 12-31
智能家居二之家庭助理
看不见的城市 - 12-28
智能家居一之物联网设备
看不见的城市 - 12-28
家庭机柜 enjoy
看不见的城市 - 12-27
樱花医院暴雨下的爱情
看不见的城市 - 05-31
标签云
embedding python
最近回复
加啦加啦 我之前更新了程序
木月 - 11-24
求最新的ndr py版本 跪求
魔法少女刘能 - 11-10
Incredible points. ...
cialis - 04-30
Good way of describ...
cialis for sale in usa - 03-25
Our lives are not o...
鱼塘里的废柴少女 - 11-09
小公司倒是去了很多家
芭比 - 08-07
GG
归档
2023-11
1
2023-05
2
2021-12
4
2020-05
1
2020-04
1
2019-05
1
2019-03
2
2018-11
3
2018-10
3
2018-09
1
2018-07
3
2018-05
1
2018-04
2
2018-03
15
© 著作权归作者所有
本文由 豆末 创作,采用 知识共享署名4.0 国际许可协议进行许可,本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。