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文件内函数名 //传入参数 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文件的作用,特此出一详解教程希望和大家共同学习。
上一篇:详解Pandas中stack()和unstack()的使用技巧
栏 目:Python代码
本文标题:C++通过内嵌解释器调用Python及间接调用Python三方库
本文地址:http://www.codeinn.net/misctech/216289.html