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

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

記得將Dlls,Lib,python36.dll拷貝到生成目錄下,如果新增python三方庫(kù),重新拷貝Lib文件夾或者進(jìn)行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ù)進(jìn)行初始化及卸載。
4.被調(diào)Python程序樣例
簡(jiǎn)單加法運(yùn)算,并且調(diào)用了numpy裝載array,作為c++間接調(diào)用Python三方庫(kù)的測(cè)試
//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運(yùn)行路徑
教程到此結(jié)束,網(wǎng)上諸多教程沒(méi)有說(shuō)明Dlls文件夾的作用,導(dǎo)致Python引用了如numpy 等三方庫(kù)后PyImport_ImportModule環(huán)節(jié)就會(huì)出錯(cuò),經(jīng)學(xué)習(xí)解釋器機(jī)理發(fā)現(xiàn)了Dlls內(nèi)pyd文件的作用,特此出一詳解教程希望和大家共同學(xué)習(xí)。
- Python與C++中梯度方向直方圖的實(shí)現(xiàn)
- C++和python實(shí)現(xiàn)單鏈表及其原理
- c++與python實(shí)現(xiàn)二分查找的原理及實(shí)現(xiàn)
- c++和python實(shí)現(xiàn)順序查找實(shí)例
- python?與c++相互調(diào)用實(shí)現(xiàn)
- python直接調(diào)用和使用swig法方調(diào)用c++庫(kù)
- 如何利用Python實(shí)現(xiàn)簡(jiǎn)單C++程序范圍分析
- 如何在C++中調(diào)用python代碼你知道嗎
- C++調(diào)用python(執(zhí)行py文件)的全過(guò)程
- Python 調(diào)用 C++ 傳遞numpy 數(shù)據(jù)詳情
相關(guān)文章
Python爬蟲(chóng)框架Scrapy實(shí)例代碼
這篇文章主要介紹了Python爬蟲(chóng)框架Scrapy實(shí)例代碼,需要的朋友可以參考下2018-03-03
基于python實(shí)現(xiàn)ROC曲線繪制廣場(chǎng)解析
這篇文章主要介紹了基于python實(shí)現(xiàn)ROC曲線繪制廣場(chǎng)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
python爬蟲(chóng)入門(mén)教程之點(diǎn)點(diǎn)美女圖片爬蟲(chóng)代碼分享
這篇文章主要介紹了python爬蟲(chóng)入門(mén)教程之點(diǎn)點(diǎn)美女圖片爬蟲(chóng)代碼分享,本文以采集抓取點(diǎn)點(diǎn)網(wǎng)美女圖片為例,需要的朋友可以參考下2014-09-09
解決numpy矩陣相減出現(xiàn)的負(fù)值自動(dòng)轉(zhuǎn)正值的問(wèn)題
這篇文章主要介紹了解決numpy矩陣相減出現(xiàn)的負(fù)值自動(dòng)轉(zhuǎn)正值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
用Python從零實(shí)現(xiàn)貝葉斯分類(lèi)器的機(jī)器學(xué)習(xí)的教程
這篇文章主要介紹了用Python從零實(shí)現(xiàn)貝葉斯分類(lèi)器的教程,樸素貝葉斯算法屬于機(jī)器學(xué)習(xí)中的基礎(chǔ)內(nèi)容、實(shí)用而高效,本文詳細(xì)展示了用Python語(yǔ)言實(shí)現(xiàn)的步驟,需要的朋友可以參考下2015-03-03

