实践在C++中调用Python函数
目标
目标是在C++中调用Python函数,给定输入,得到输出。
主要参考:
如何实现 C/C++ 与 Python 的通信? - 知乎
C++调用Python脚本中的函数 - Achimesir - 博客园
Python的C语言API官方文档:Python/C API 参考手册 — Python 文档
0.准备阶段
1)下载python
在官网上下载python。
我选择的是64位安装版:
随后会在安装目录找到一些需要的东西:
include文件夹
:
里面是一些C语言代码头文件。其中将存放着供C语言调用的函数的定义。
libs文件夹
:
里面是一些.lib
文件。
关于存放的内容:.lib
可能存着函数具体的实现,也可能是存着索引dll
中函数实现的信息。由于这里的.lib
文件相对较小,而且目录里有dll
,所以存放的内容我想是后者。
dll文件
:
存着函数的具体实现
2)创建项目
建立一个C++控制台应用
然后,我选择Release
和x64
。(我选debug版时,会报找不到lib的问题)
3)配置路径
将include文件夹
加入附加包含目录(头文件目录):
将libs文件夹
加入附加库目录:
将所有dll
拷贝到工程目录下:
实验1:运行一条python语句
C++代码如下:
#include <Python.h>int main()
{//程序名:Py_SetProgramName(L"TestYaksue");//初始化Py_Initialize();//运行一个语句PyRun_SimpleString("print('Hello World in Python!')\n");Py_Finalize();return 0;
}
输出:
实验2:调用python中的函数
在YaksueTest.py
文件中定义一个叫MyFunc
的函数:
def MyFunc(InParm):print("InParm:"+str(InParm))return InParm*3;
在C++中,需要导入这个文件(也就是模块)。为了能让YaksueTest.py
被找到,我将其放到了exe
文件的同级目录:
C++代码:
#include <Python.h>#include<iostream>//调用python的函数
int CallPythonFunction(int InParm)
{//导入文件(模块) PyObject* pModule = PyImport_ImportModule("YaksueTest");//找到函数的地址PyObject* pFunc = PyObject_GetAttrString(pModule, "MyFunc");//创建参数:PyObject* pArgs = PyTuple_New(1);//设置参数的值PyTuple_SetItem(pArgs, 0, PyLong_FromLong(InParm));//调用函数PyObject* pReturnValue = PyObject_CallObject(pFunc, pArgs);//转换为C语言类型并返回return PyLong_AsLong(pReturnValue);
}int main()
{//程序名:Py_SetProgramName(L"TestYaksue");//初始化Py_Initialize();//运行函数int value = CallPythonFunction(7);std::cout<<"CallPythonFunction: " << value << std::endl;Py_Finalize();return 0;
}
输出:
疑问探究:具体的lib文件是如何链接的
我在【配置路径】的步骤中,将libs文件夹加入了附加库目录。
然而,这只是加入了lib文件的路径,并没有对具体的库进行链接。比如在《创建一个最小的D3D11实例》中,我在加入lib的路径之后,又在配置中指定了对具体哪个库进行链接。那么在当前的工程里,“链接具体的库”是如何办到的呢?
我知道除了在工程中配置的方法,也可以通过pragma comment进行这一操作。于是进行操作,发现果不其然:
实践在C++中调用Python函数相关推荐
- python中execute函数_在excel中调用python函数
效果: 通过excel引用在py文件中写好的load_settle()函数,可以快捷的获取对应的历史结算价. 使用方法: 1.首先安装office,我用的是2016版本. 2.安装python,推荐使 ...
- C++回调函数中调用Python函数出现的死锁问题调试及解决
一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...
- html调用python_flask之模板html中调用python函数方法
一:html里面可以调用python写的函数 add_template_global(调用函数的引用,"调用函数的名字") from common.libs.UrlManager ...
- TX2(Linux)在Qt中调用python函数
实验环境:TX2使用JetPack-L4T-3.3-linux-x64_b39进行环境安装 详情参考:Jetpack3.3刷机 安装的python版本为3.5.2 1.创建Qt工程 在Qt中创建一个Q ...
- java中调用python
在Java中调用Python </h1><div class="clear"></div><div class="postBod ...
- 在Java中调用Python,java面试题,java初级笔试题
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 写在 ...
- 【Qt】Qt中调用python接口
在Qt程序中调用python函数从步骤 1.在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/li ...
- fortran语言和python_如何在Fortran中调用Python
Python是机器学习领域不断增长的通用语言.拥有一些非常棒的工具包,比如scikit-learn,tensorflow和pytorch.气候模式通常是使用Fortran实现的.那么我们应该将基于Py ...
- 使用xlwings插件在Excel中调用Python
xlwings官方文档: 英文版:https://docs.xlwings.org/en/stable/# 中文版:https://www.kancloud.cn/gnefnuy/xlwings-do ...
最新文章
- 中国团队新型类脑芯片登上《自然》封面
- MIT重磅报告:一文看清AI商业化现状与未来
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
- 专题2 文件系统结构
- boost::is_sorted相关的测试程序
- 获得md5加密后的字符串
- python hashlib 哈希算法
- [转] new 和delete
- cf两边黑屏怎么解决win10_win10玩红警卡顿黑屏,这样解决,有些老游戏也可以借鉴哦
- html字体白色边框黑色效果,css完整总结:第二篇(尺寸,外补白,内补白,边框,背景,颜色,字体,文本,文本装饰)...
- 最简单的基金理财讲解
- 「产品读书」精益创业
- 大点干!早点散----------深入剖析LVS负载均衡群集原理
- win7虚拟机不安装VMware Tools实现传输文件
- 神武服务器物品开放,《神武4》宠物携带等级规则调整限服测试 生存大挑战等玩法优化全服开放...
- 公众号被 SRS 大佬推荐是怎么样一种体验~~
- 随着我国经济的持续快速发展,城市轻物流需求大幅增长
- Robin六种常用负载均衡算法源码解析
- python不需要先声明变量类型、在第一次_Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类型。...
- 10000以内素数求法--Python
热门文章
- (25.2)类的定义之类的数据成员,类的成员函数,类的声明
- 诚之和:Pytorch 统计模型参数量的操作 param.numel()
- asterisk语音菜单wav的制作
- 点击化学嫁接聚乙二醇包裹疏水性半导体聚合物,点击化学修饰疏水有机聚合物
- 《乐高EV3机器人搭建与编程》——2.4 坦克履带
- Excel的PowerMap
- 人工智能在医疗领域的应用:预测疾病和提高治疗效果
- 2019移动广告反欺诈算法挑战赛之初始数据分析
- 【SpringBoot】面试必杀技-泰山陨石坠,SpringBoot中主启动类的run方法启动流程是什么?
- Java常见面试题:类的加载过程