青春正年少我要大聲笑lamusique
最近一直思考如何將彌補c++中的資料探勘演算法不足的問題,畢竟現在大家都圖省事的說。於是現有語言中屬python的庫檔案最多,且簡單的膠水語言。那麼通過c++呼叫Python會不會很方便呢?所以本著這樣的想法我們研究一下。
1、對python目錄下的檔案檢查
首先你得安裝python 我這裡是python3.4,開啟安裝目錄下的include資料夾,也就找到了python.h,如圖圈出!
然後開啟python34下的libs資料夾,找到python34.lib,複製並貼上更改名稱為python34_d.lib
好滴,這樣一來檔案就檢查 準備完畢了。
2、C++環境的配置(VS2013)
首先新建專案---空專案命名---新增原始檔cpp。對專案進行右鍵屬性,C/C++、常規、對附加包含目錄新增D:\Python34\include路徑(就是第一步操作檢測的資料夾新增路徑就行了)
然後在連結器---輸入---附加依賴項,手動新增python34.lib
最後在連結器---常規---附加庫目錄,新增D:\Python34\libs(也就是第一步操作中檢測的資料夾)
這時候你再在cpp原始檔中新增#include<python.h>,就顯示Ok了,找到標頭檔案了
3、編寫python檔案
我這裡寫的是
def Hello(): print("Hello Python") def Add(a, b): import numpy as np print(np.pi) return a+b 注意的是,以呼叫函式的形式,模組庫的呼叫寫到def函式結構中去;得到的python(.py)檔案請加到C++的main檔案所在資料夾中去!
4、編寫C++,實現C++呼叫python檔案
直接上程式碼,C++的函式實現對python中的兩個函式進行重新構造(初始化、傳參、執行、輸出、結束)
#include <Python.h> #include <iostream> //#include <math.h>
using namespace std;
extern "C" { #include "Python.h" }
//呼叫輸出"Hello Python"函式 void Hello() { Py_Initialize();//呼叫Py_Initialize()進行初始化 PyObject * pModule = NULL; PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//呼叫的Python檔名 pFunc = PyObject_GetAttrString(pModule, "Hello");//呼叫的函式名 PyEval_CallObject(pFunc, NULL);//呼叫函式,NULL表示引數為空 Py_Finalize();//呼叫Py_Finalize,和Py_Initialize相對應的. } //呼叫py檔案中的Add函式,傳兩個int型引數 void Add() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule = PyImport_ImportModule("Test001");//Test001:Python檔名 pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python檔案中的函式名 //建立引數: PyObject *pArgs = PyTuple_New(2);//函式呼叫的引數傳遞均是以元組的形式打包的,2表示引數個數 PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序號,i表示建立int型變數 PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序號 //返回值 PyObject *pReturn = NULL; pReturn = PyEval_CallObject(pFunc, pArgs);//呼叫函式 //將返回值轉換為int型別 int result; PyArg_Parse(pReturn, "i", &result);//i表示轉換成int型變數 cout << "6 + 8 = " << result << endl; Py_Finalize(); }
int main(int argc, char** argv) { cout << "呼叫Test001.py中的Hello函式..." << endl; Hello(); cout << "\n呼叫Test001.py中的Add函式..." << endl; Add(); system("pause"); return 0; }