1. 程式人生 > >青春正年少我要大聲笑lamusique

青春正年少我要大聲笑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; }