C++通过内嵌解释器调用Python及间接调用Python三方库

 更新时间:2021年12月30日 10:43:30   作者:Method.Jiao  
本文主要介绍了C++通过内嵌解释器调用Python及间接调用Python三方库,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文章目的是脱离安装Python环境的前提下,由C++程序调用Python程序及Python相关三方库

1.移植Python解释器

Python环境的目录结构

python环境

路径详解

需要用的如下图
1.红色部分是生成路径下解释器运行时依赖
将红色部分拷贝到C++编译主ExE路径下即可
2.蓝色部分是VS配置编译时依赖

路径或文件名 作用
DLLs Python内部运行时核心及一些驱动
Lib 这里存放Python基础类库,开发人员所下载的Python三方库也会放在此目录下
python36.dll Python运行时主依赖

路径或文件名 作用
include C++调用所依赖的头文件,include时引用Python.h即可
libs C++调用所依赖的静态描述文件,C++Dll隐式调用引用python36.lib即可

2.VS配置(VS2017为例,此教程与VS版本无关)

这里我就写绝对路径为例
在这里插入图片描述
记得将Dlls,Lib,python36.dll拷贝到生成目录下,如果新增python三方库,重新拷贝Lib文件夹或者进行whl安装,这里就不做whl的介绍了

//在stdafx.cpp中
#pragma comment(lib,"python36.lib")

3.C++调用程序样例

Py_Initialize();//加载Python解释器
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('Dlls/')");

PyObject * pModule = NULL;
PyObject * pFunc = NULL;
PyObject *pArgs = NULL;
PyObject *pResult = NULL;
pModule = PyImport_ImportModule("ExternalPythonTool");//Python py文件名
if (pModule == nullptr)
	return true;
pFunc = PyObject_GetAttrString(pModule, "add_func");//py文件内函数名
//传入参数
pArgs = Py_BuildValue("ii", 1, 2);
//执行函数
pResult = PyObject_CallObject(pFunc, pArgs);
//返回值为C++
double a = PyLong_AsDouble(pResult);

Py_Finalize();//卸载Python解释器

Py_Initialize方法初始化消耗资源较大,不建议反复进行初始化及卸载。

4.被调Python程序样例

简单加法运算,并且调用了numpy装载array,作为c++间接调用Python三方库的测试

//ExternalPythonTool.py
import math
import numpy as np
def add_func(x,y):
    a = math.sqrt(9)
    data = [[1,2],[3,4],[5,6]]
    b = np.array(data)
    return x + y

将ExternalPythonTool.py也拷贝到C++exe运行路径

教程到此结束,网上诸多教程没有说明Dlls文件夹的作用,导致Python引用了如numpy 等三方库后PyImport_ImportModule环节就会出错,经学习解释器机理发现了Dlls内pyd文件的作用,特此出一详解教程希望和大家共同学习。

相关文章

  • 盘点总结Python爬虫常用库(附官方文档)

    盘点总结Python爬虫常用库(附官方文档)

    在信息时代,数据是无处不在的宝藏,从网页内容、社交媒体帖子到在线商店的产品信息,互联网上存在着大量的数据等待被收集和分析,Python爬虫是一种强大的工具,用于从互联网上获取和提取数据
    2023-11-11
  • Python 循环结构详解

    Python 循环结构详解

    这篇文章主要介绍了Python 循环结构,程序的循环结构逻辑,循环就是按照一定的条件重复的去做一件事情,当条件不成立时就结束循环的内容,需要的小伙伴一起和小编一起进入下面文章学习吧
    2022-02-02
  • 详解将Python程序(.py)转换为Windows可执行文件(.exe)

    详解将Python程序(.py)转换为Windows可执行文件(.exe)

    这篇文章主要介绍了详解将Python程序(.py)转换为Windows可执行文件(.exe),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • 基于打开pycharm有带图片md文件卡死问题的解决

    基于打开pycharm有带图片md文件卡死问题的解决

    这篇文章主要介绍了基于打开pycharm有带图片md文件卡死问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 基于PyQT5制作一个课堂点名系统

    基于PyQT5制作一个课堂点名系统

    这篇文章主要为大家介绍一个基于PyQt5实现的抖音同款课堂点名系统,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02
  • 浅析Python 实现一个自动化翻译和替换的工具

    浅析Python 实现一个自动化翻译和替换的工具

    这篇文章主要介绍了Python 实现一个自动化翻译和替换的工具,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • 利用Python实现快速批量转换HEIC文件

    利用Python实现快速批量转换HEIC文件

    HEIC 是苹果采用的新的默认图片格式,它能在不损失图片画质的情况下,减少图片大小。本篇文章将使用 Python 批量实现 HEIC 图片文件的格式转换,需要的可以参考一下
    2022-07-07
  • Python析构函数__del__定义原理解析

    Python析构函数__del__定义原理解析

    这篇文章主要介绍了Python析构函数__del__定义原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Python发送网络请求(requests)

    Python发送网络请求(requests)

    这篇文章主要介绍了Python发送网络请求(requests),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python 解析xml文件的示例

    Python 解析xml文件的示例

    这篇文章主要介绍了Python 解析xml文件的示例,帮助大家更好的利用python处理文件,感兴趣的朋友可以了解下
    2020-09-09

最新评论