目标

目标是在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++控制台应用

然后,我选择Releasex64。(我选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函数相关推荐

  1. python中execute函数_在excel中调用python函数

    效果: 通过excel引用在py文件中写好的load_settle()函数,可以快捷的获取对应的历史结算价. 使用方法: 1.首先安装office,我用的是2016版本. 2.安装python,推荐使 ...

  2. C++回调函数中调用Python函数出现的死锁问题调试及解决

    一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...

  3. html调用python_flask之模板html中调用python函数方法

    一:html里面可以调用python写的函数 add_template_global(调用函数的引用,"调用函数的名字") from common.libs.UrlManager ...

  4. TX2(Linux)在Qt中调用python函数

    实验环境:TX2使用JetPack-L4T-3.3-linux-x64_b39进行环境安装 详情参考:Jetpack3.3刷机 安装的python版本为3.5.2 1.创建Qt工程 在Qt中创建一个Q ...

  5. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  6. 在Java中调用Python,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 写在 ...

  7. 【Qt】Qt中调用python接口

    在Qt程序中调用python函数从步骤 1.在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/li ...

  8. fortran语言和python_如何在Fortran中调用Python

    Python是机器学习领域不断增长的通用语言.拥有一些非常棒的工具包,比如scikit-learn,tensorflow和pytorch.气候模式通常是使用Fortran实现的.那么我们应该将基于Py ...

  9. 使用xlwings插件在Excel中调用Python

    xlwings官方文档: 英文版:https://docs.xlwings.org/en/stable/# 中文版:https://www.kancloud.cn/gnefnuy/xlwings-do ...

最新文章

  1. 中国团队新型类脑芯片登上《自然》封面
  2. MIT重磅报告:一文看清AI商业化现状与未来
  3. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
  4. 专题2 文件系统结构
  5. boost::is_sorted相关的测试程序
  6. 获得md5加密后的字符串
  7. python hashlib 哈希算法
  8. [转] new 和delete
  9. cf两边黑屏怎么解决win10_win10玩红警卡顿黑屏,这样解决,有些老游戏也可以借鉴哦
  10. html字体白色边框黑色效果,css完整总结:第二篇(尺寸,外补白,内补白,边框,背景,颜色,字体,文本,文本装饰)...
  11. 最简单的基金理财讲解
  12. 「产品读书」精益创业
  13. 大点干!早点散----------深入剖析LVS负载均衡群集原理
  14. win7虚拟机不安装VMware Tools实现传输文件
  15. 神武服务器物品开放,《神武4》宠物携带等级规则调整限服测试 生存大挑战等玩法优化全服开放...
  16. 公众号被 SRS 大佬推荐是怎么样一种体验~~
  17. 随着我国经济的持续快速发展,城市轻物流需求大幅增长
  18. Robin六种常用负载均衡算法源码解析
  19. python不需要先声明变量类型、在第一次_Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类型。...
  20. 10000以内素数求法--Python

热门文章

  1. (25.2)类的定义之类的数据成员,类的成员函数,类的声明
  2. 诚之和:Pytorch 统计模型参数量的操作 param.numel()
  3. asterisk语音菜单wav的制作
  4. 点击化学嫁接聚乙二醇包裹疏水性半导体聚合物,点击化学修饰疏水有机聚合物
  5. 《乐高EV3机器人搭建与编程》——2.4 坦克履带
  6. Excel的PowerMap
  7. 人工智能在医疗领域的应用:预测疾病和提高治疗效果
  8. 2019移动广告反欺诈算法挑战赛之初始数据分析
  9. 【SpringBoot】面试必杀技-泰山陨石坠,SpringBoot中主启动类的run方法启动流程是什么?
  10. Java常见面试题:类的加载过程