C++中嵌入Python調用

python嵌入到C++中

把python嵌入的C++裏面須要作一些步驟

  • 安裝python程序,這樣才能使用python的頭文件和庫
  • 在咱們寫的源文件中增長「Python.h」頭文件,而且鏈入「python**.lib」庫(還沒搞清楚這個庫時靜態庫仍是導出庫,須要搞清楚)
  • 掌握和了解一些python的C語言api,以便在咱們的c++程序中使用

經常使用的一些C API函數

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

Py_Initialize()&&Py_Finalize()

在調用任何python的c函數以前須要調用的函數,「Py_Initialize」是用來初始化python模塊的,推測是加載初始化加載dll的。對應的在使用python模塊以後用「Py_Finalize」來釋放模塊。ios

PyImport_ImportModule()

用來載入一個python模塊,這個模塊就是通常的python文件。這裏須要注意的是,在加載這個模塊的時候會執行模塊裏面全部能夠執行的語句。包括import導入語句和在函數體以外的全部語句c++

PyObject_GetAttrString()

返回模塊裏面的函數api

Py_BuildValue()

創建一個參數元組,通常都是用這個函數來創建元組,而後將這個元組做爲參數傳遞給python裏面的函數。函數

PyEval_CallObject()

調用函數,並把「Py_BuildValue」創建的元組做爲參數傳遞給被調用的函數ui

源碼實例

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

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代碼code

def main(szString):
    return ("hello", 5)
相關文章
相關標籤/搜索