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

编程知识 行业动态 更新时间:2024-06-13 00:18:45

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

  • 1.移植Python解释器
    • Python环境的目录结构
    • 路径详解
  • 2.VS配置(VS2017为例,此教程与VS版本无关)
  • 3.C++调用程序样例
  • 4.被调Python程序样例

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

1.移植Python解释器

Python环境的目录结构

路径详解

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

路径或文件名作用
DLLsPython内部运行时核心及一些驱动
Lib这里存放Python基础类库,开发人员所下载的Python三方库也会放在此目录下
python36.dllPython运行时主依赖
路径或文件名作用
includeC++调用所依赖的头文件,include时引用Python.h即可
libsC++调用所依赖的静态描述文件,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文件的作用,特此出一详解教程希望和大家共同学习。

更多推荐

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

本文发布于:2023-03-27 04:59:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/e67ca37eb7b39eb7153a07fc687f48ce.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:三方   内嵌   Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!