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.紅色部分是生成路徑下解釋器運(yùn)行時(shí)依賴
將紅色部分拷貝到C++編譯主ExE路徑下即可
2.藍(lán)色部分是VS配置編譯時(shí)依賴
路徑或文件名 | 作用 |
---|---|
DLLs | Python內(nèi)部運(yùn)行時(shí)核心及一些驅(qū)動 |
Lib | 這里存放Python基礎(chǔ)類庫,開發(fā)人員所下載的Python三方庫也會放在此目錄下 |
python36.dll | Python運(yùn)行時(shí)主依賴 |
路徑或文件名 | 作用 |
---|---|
include | C++調(diào)用所依賴的頭文件,include時(shí)引用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文件夾或者進(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程序樣例
簡單加法運(yùn)算,并且調(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運(yùn)行路徑
教程到此結(jié)束,網(wǎng)上諸多教程沒有說明Dlls文件夾的作用,導(dǎo)致Python引用了如numpy 等三方庫后PyImport_ImportModule環(huán)節(jié)就會出錯(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++庫
- 如何利用Python實(shí)現(xiàn)簡單C++程序范圍分析
- 如何在C++中調(diào)用python代碼你知道嗎
- C++調(diào)用python(執(zhí)行py文件)的全過程
- Python 調(diào)用 C++ 傳遞numpy 數(shù)據(jù)詳情
相關(guān)文章
基于python實(shí)現(xiàn)ROC曲線繪制廣場解析
這篇文章主要介紹了基于python實(shí)現(xiàn)ROC曲線繪制廣場解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06python爬蟲入門教程之點(diǎn)點(diǎn)美女圖片爬蟲代碼分享
這篇文章主要介紹了python爬蟲入門教程之點(diǎn)點(diǎn)美女圖片爬蟲代碼分享,本文以采集抓取點(diǎn)點(diǎn)網(wǎng)美女圖片為例,需要的朋友可以參考下2014-09-09解決numpy矩陣相減出現(xiàn)的負(fù)值自動轉(zhuǎn)正值的問題
這篇文章主要介紹了解決numpy矩陣相減出現(xiàn)的負(fù)值自動轉(zhuǎn)正值的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06用Python從零實(shí)現(xiàn)貝葉斯分類器的機(jī)器學(xué)習(xí)的教程
這篇文章主要介紹了用Python從零實(shí)現(xiàn)貝葉斯分類器的教程,樸素貝葉斯算法屬于機(jī)器學(xué)習(xí)中的基礎(chǔ)內(nèi)容、實(shí)用而高效,本文詳細(xì)展示了用Python語言實(shí)現(xiàn)的步驟,需要的朋友可以參考下2015-03-03