C++通過內(nèi)嵌解釋器調(diào)用Python及間接調(diào)用Python三方庫
本文章目的是脫離安裝Python環(huán)境的前提下,由C++程序調(diào)用Python程序及Python相關(guān)三方庫
1.移植Python解釋器
Python環(huán)境的目錄結(jié)構(gòu)

路徑詳解
需要用的如下圖
1.紅色部分是生成路徑下解釋器運行時依賴
將紅色部分拷貝到C++編譯主ExE路徑下即可
2.藍色部分是VS配置編譯時依賴
| 路徑或文件名 | 作用 |
|---|---|
| DLLs | Python內(nèi)部運行時核心及一些驅(qū)動 |
| Lib | 這里存放Python基礎(chǔ)類庫,開發(fā)人員所下載的Python三方庫也會放在此目錄下 |
| python36.dll | Python運行時主依賴 |
| 路徑或文件名 | 作用 |
|---|---|
| include | C++調(diào)用所依賴的頭文件,include時引用Python.h即可 |
| libs | C++調(diào)用所依賴的靜態(tài)描述文件,C++Dll隱式調(diào)用引用python36.lib即可 |
2.VS配置(VS2017為例,此教程與VS版本無關(guān))
這里我就寫絕對路徑為例

記得將Dlls,Lib,python36.dll拷貝到生成目錄下,如果新增python三方庫,重新拷貝Lib文件夾或者進行whl安裝,這里就不做whl的介紹了
//在stdafx.cpp中 #pragma comment(lib,"python36.lib")
3.C++調(diào)用程序樣例
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文件內(nèi)函數(shù)名
//傳入?yún)?shù)
pArgs = Py_BuildValue("ii", 1, 2);
//執(zhí)行函數(shù)
pResult = PyObject_CallObject(pFunc, pArgs);
//返回值為C++
double a = PyLong_AsDouble(pResult);
Py_Finalize();//卸載Python解釋器
Py_Initialize方法初始化消耗資源較大,不建議反復(fù)進行初始化及卸載。
4.被調(diào)Python程序樣例
簡單加法運算,并且調(diào)用了numpy裝載array,作為c++間接調(diào)用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運行路徑
教程到此結(jié)束,網(wǎng)上諸多教程沒有說明Dlls文件夾的作用,導(dǎo)致Python引用了如numpy 等三方庫后PyImport_ImportModule環(huán)節(jié)就會出錯,經(jīng)學(xué)習(xí)解釋器機理發(fā)現(xiàn)了Dlls內(nèi)pyd文件的作用,特此出一詳解教程希望和大家共同學(xué)習(xí)。
- Python與C++中梯度方向直方圖的實現(xiàn)
- C++和python實現(xiàn)單鏈表及其原理
- c++與python實現(xiàn)二分查找的原理及實現(xiàn)
- c++和python實現(xiàn)順序查找實例
- python?與c++相互調(diào)用實現(xiàn)
- python直接調(diào)用和使用swig法方調(diào)用c++庫
- 如何利用Python實現(xiàn)簡單C++程序范圍分析
- 如何在C++中調(diào)用python代碼你知道嗎
- C++調(diào)用python(執(zhí)行py文件)的全過程
- Python 調(diào)用 C++ 傳遞numpy 數(shù)據(jù)詳情
相關(guān)文章
python PIL/cv2/base64相互轉(zhuǎn)換實例
今天小編就為大家分享一篇python PIL/cv2/base64相互轉(zhuǎn)換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
創(chuàng)建SparkSession和sparkSQL的詳細(xì)過程
SparkSession 是 Spark SQL 的入口,Builder 是 SparkSession 的構(gòu)造器。 通過 Builder, 可以添加各種配置,并通過 stop 函數(shù)來停止 SparkSession,本文給大家分享創(chuàng)建SparkSession和sparkSQL的詳細(xì)過程,一起看看吧2021-08-08
Python實現(xiàn)基于KNN算法的筆跡識別功能詳解
這篇文章主要介紹了Python實現(xiàn)基于KNN算法的筆跡識別功能,結(jié)合實例形式詳細(xì)分析了使用KNN算法進行筆跡識別的相關(guān)庫引入、操作步驟與相關(guān)注意事項,需要的朋友可以參考下2018-07-07
Python企業(yè)編碼生成系統(tǒng)總體系統(tǒng)設(shè)計概述
這篇文章主要介紹了Python企業(yè)編碼生成系統(tǒng)總體系統(tǒng)設(shè)計,簡單描述了Python企業(yè)編碼生成系統(tǒng)的功能、結(jié)構(gòu)與相關(guān)編碼實現(xiàn)技巧,需要的朋友可以參考下2019-07-07

