將Python代碼嵌入C++程序進行編寫


將Python代碼嵌入C++程序進行編寫的實例,python嵌入

 

把python嵌入的C++里面需要做一些步驟

    安裝python程序,這樣才能使用python的頭文件和庫

    在我們寫的源文件中增加“Python.h”頭文件,並且鏈入“python**.lib”庫(還沒搞清楚這個庫時靜態庫還是導出庫,需要搞清楚)

    掌握和了解一些python的C語言api,以便在我們的c++程序中使用

常用的一些C API函數

 

在了解下面的函數之前有必要了解一下**PyObject***指針,python里面幾乎所有的對象都是使用這個指針來指示的。

Py_Initialize()&&Py_Finalize()

    在調用任何python的c函數之前需要調用的函數,“Py_Initialize”是用來初始化python模塊的,推測是加載初始化加載dll的。對應的在使用python模塊之后用“Py_Finalize”來釋放模塊。

PyImport_ImportModule()

 

    用來載入一個python模塊,這個模塊就是一般的python文件。這里需要注意的是,在加載這個模塊的時候會執行模塊里面所有可以執行的語句。包括import導入語句和在函數體之外的所有語句

PyObject_GetAttrString()

 

    返回模塊里面的函數

Py_BuildValue()

 

    建立一個參數元組,一般都是用這個函數來建立元組,然后將這個元組作為參數傳遞給python里面的函數。

PyEval_CallObject()

 

    調用函數,並把“Py_BuildValue”建立的元組作為參數傳遞給被調用的函數

源碼實例

 

下面的實例是在c++代碼中調用Python的函數,傳遞參數並且獲取返回值

test.cpp代碼

#include <iostream>

#include <Python.h>

using namespace std;

 

int main(int argc, char* argv[])

{

  Py_Initialize();  //初始化

 

  PyObject* pModule = NULL;

  PyObject* pFunc = NULL;

  PyObject* pParam = NULL;

  PyObject* pResult = NULL;

  const char* pBuffer = NULL;

  int iBufferSize = 0;

 

  pModule = PyImport_ImportModule(“test_python");

 

  if (!pModule)

  {

    cout << "get module failed!" << endl;

    exit (0);

  }

 

  pFunc = PyObject_GetAttrString(pModule, "main");

  if (!pFunc)

  {

    cout << "get func failed!" << endl;

    cout << int(pFunc) << endl;

    exit (0);

  }

  pParam = Py_BuildValue("(s)", "HEHEHE");

  pResult = PyEval_CallObject(pFunc,pParam);

  if(pResult)

  {

    if(PyArg_Parse(pResult, "(si)", &pBuffer, iBufferSize))

    {

      cout << pBuffer << endl;

      cout << iBufferSize << endl;

    }

  }

  Py_DECREF(pParam);

  Py_DECREF(pFunc);

 

  Py_Finalize();

  //cout << "hello" << endl;

 

return 0;

}

 

test_python.py代碼

def main(szString):

  return ("hello", 5)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM