-
C++ 和python的混合編程
-
windows + vs
-
新建一個工程,在工程屬性中添加如下的幾個

C:\Users\[user_name]\Anaconda3\include
C:\Users\[user_name]\Anaconda3\Lib
C:\Users\[user_name]\Anaconda3\libs
具體路徑根據自己python的安裝情況確定。
-
添加附加依賴項
pytyhon36.lib,具體參照自己的文件路徑以及python版本

-
如果需要在
DEBUG下運行,需要修改pyconfig.h文件,我的電腦上的位置為C:\Users\chmtt\Anaconda3\include\pyconfig.h打開以后在293行,將python36_d.lib修改為python36.lib即可。如果直接在release下運行無需操作。 -
假設需要調用的
python腳本為默認你已經寫好
tensorflow的python腳本,並能跑成功。(tensorflow的使用不是本文重點)
c++需要調用的就是這個classify.py里面的evaluate函數,傳入圖片路徑,返回分類結果給c++程序from PIL import Image import numpy as np import tensorflow as tf def evaluate(pic): image = Image.open(pic) image = image.resize([256, 256]) image_array = np.array(image) with tf.Graph().as_default(): #里面就是對圖像讀取模型,預測,得到prediction…… max_index = np.argmax(prediction) return max_index -
C++Demo
#include <Python.h> #include <iostream> int main(int argc, char** argv) { const char* picpath ="/home/pdd/PD/c++/c++python/pic/0.0.jpg"; Py_Initialize(); if ( !Py_IsInitialized() ) { return -1; } PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); PyObject* pMod = NULL; PyObject* pFunc = NULL; PyObject* pParm = NULL; PyObject* pRetVal = NULL; int iRetVal = -999; const char* modulName="classify"; //這個是被調用的py文件模塊名字 pMod = PyImport_ImportModule(modulName); if(!pMod) { return -1; } const char* funcName="evaluate"; //這是此py文件模塊中被調用的函數名字 pFunc = PyObject_GetAttrString(pMod, funcName); if(!pFunc) { return -2; } pParm = PyTuple_New(1); PyTuple_SetItem(pParm, 0, Py_BuildValue("s",picpath));//傳入的參數,是圖片的路徑 pRetVal = PyEval_CallObject(pFunc, pParm);//這里開始執行py腳本 PyArg_Parse(pRetVal, "i", &iRetVal);//py腳本返回值給iRetVal //PyErr_Print(); std::cout<<iRetVal; return iRetVal; }
-
-
ubuntu
安裝了
anaconda,tensorflowC++ 和 python代碼與上面類似。在構建執行文件時
main:c++python.cpp g++ -o out c++python.cpp -I/home/pdd/anaconda3/include/python3.6m -lpython3.6m -L /home/pdd/anaconda3/lib clean: rm -rf *.o-I后面的/home/pdd/anaconda3/include/python3.6m有需要的Python.h;-lpython3.6m鏈接到需要的libpython3.6m.so;-L指出鏈接的路徑。終端輸入make。如果提示需要什么
libpython3.6m.so,就把/home/pdd/anaconda3/lib下的libpython3.6m.*.so復制到/usr/lib/下(sudo cp ——–) 此時再次輸入make,一切ok!得到out文件,輸入./out
-
-
源碼編譯運行。
大體的流程如下:
- 1.使用
tensorflow python API編寫和訓練自己的模型,訓練完成后,使用tensorflow saver將模型保存下來。 - 2.使用
tensorflow c++ API構建新的session,讀取python版本保存的模型,然后使用session->run()獲得模型的輸出。 - 3.編譯和運行基於
tensorflow c++ API寫的代碼。
- Ubuntu
- windows
- 1.使用
