1. 程式人生 > >C++呼叫python步驟

C++呼叫python步驟

最近一直思考如何將彌補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;
}