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 PIL/cv2/base64相互转换实例

    python PIL/cv2/base64相互转换实例

    今天小编就为大家分享一篇python PIL/cv2/base64相互转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python学生管理系统

    python学生管理系统

    这篇文章主要为大家详细介绍了python学生管理系统的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 创建SparkSession和sparkSQL的详细过程

    创建SparkSession和sparkSQL的详细过程

    SparkSession 是 Spark SQL 的入口,Builder 是 SparkSession 的构造器。 通过 Builder, 可以添加各种配置,并通过 stop 函数来停止 SparkSession,本文给大家分享创建SparkSession和sparkSQL的详细过程,一起看看吧
    2021-08-08
  • 解决python flask中config配置管理的问题

    解决python flask中config配置管理的问题

    今天小编就为大家分享一篇解决python flask中config配置管理的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python内建模块struct实例详解

    Python内建模块struct实例详解

    这篇文章主要介绍了Python内建模块struct实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • python基础之//、/与%的区别详解

    python基础之//、/与%的区别详解

    在学习Python或者使用Python进行工作的时候,大家应该都看到过“/”和“//”,下面这篇文章主要给大家介绍了关于python基础之//、/与%区别的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 基于django ManyToMany 使用的注意事项详解

    基于django ManyToMany 使用的注意事项详解

    今天小编就为大家分享一篇基于django ManyToMany 使用的注意事项详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python实现Logger打印功能的方法详解

    Python实现Logger打印功能的方法详解

    最近工作中遇到了打印的需求,通过查找相关的资料发现Python中Logger可以很好的实现打印,所以下面这篇文章主要给大家介绍了关于Python如何实现Logger打印功能的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-09-09
  • Python实现基于KNN算法的笔迹识别功能详解

    Python实现基于KNN算法的笔迹识别功能详解

    这篇文章主要介绍了Python实现基于KNN算法的笔迹识别功能,结合实例形式详细分析了使用KNN算法进行笔迹识别的相关库引入、操作步骤与相关注意事项,需要的朋友可以参考下
    2018-07-07
  • Python企业编码生成系统总体系统设计概述

    Python企业编码生成系统总体系统设计概述

    这篇文章主要介绍了Python企业编码生成系统总体系统设计,简单描述了Python企业编码生成系统的功能、结构与相关编码实现技巧,需要的朋友可以参考下
    2019-07-07

最新评论