C++通过内嵌解释器调⽤Python及间接调⽤Python三⽅库C++通过内嵌解释器调⽤Python及间接调⽤Python三⽅库
本⽂章⽬的是脱离安装Python环境的前提下,由C++程序调⽤Python程序及Python相关三⽅库
1.移植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⽂件内函数名
//传⼊参数
python解释器下载
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⽂件的作⽤,特此出⼀详解教程希望和⼤家共同学习。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。