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í)依賴
將紅色部分拷貝到C++編譯主ExE路徑下即可
2.藍(lán)色部分是VS配置編譯時(shí)依賴
路徑或文件名 | 作用 |
---|---|
DLLs | Python內(nèi)部運(yùn)行時(shí)核心及一些驅(qū)動(dòng) |
Lib | 這里存放Python基礎(chǔ)類庫(kù),開(kāi)發(fā)人員所下載的Python三方庫(kù)也會(huì)放在此目錄下 |
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版本無(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-06python爬蟲(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)貝葉斯分類器的機(jī)器學(xué)習(xí)的教程
這篇文章主要介紹了用Python從零實(shí)現(xiàn)貝葉斯分類器的教程,樸素貝葉斯算法屬于機(jī)器學(xué)習(xí)中的基礎(chǔ)內(nèi)容、實(shí)用而高效,本文詳細(xì)展示了用Python語(yǔ)言實(shí)現(xiàn)的步驟,需要的朋友可以參考下2015-03-03