Python筆記(一)——C/C++調用python

來源:互聯網
上載者:User

最近因為研究一個東西,並且在很久以前就想把python好好看看。正好滿足我的好奇心。我每天上班做得遊戲都是用lua,也是一門很強大的指令碼語言。可能我更喜歡python的縮排區分和物件導向吧。 今天唯寫一個簡單的例子。一個簡單的python指令碼,就一個函數,用C/C++去調用。可能這也是作為程式來說最關心的一件事。所以我的python筆記也就最先寫這塊。- -  好切入正題:

 

#include <Python.h>
#include <stdio.h>

void test( void )
{
    PyObject *pMod    = NULL;
    PyObject *pFun    = NULL;
    PyObject *pParm   = NULL;
    PyObject *pRetVal = NULL;
    int iRetval       = 0;

    if ( pMod = PyImport_ImportModule( "add" ) )
    {
        if ( pFun = PyObject_GetAttrString( pMod, "add" ) )
        {
            pParm = PyTuple_New( 2 );
            PyTuple_SetItem( pParm, 0, Py_BuildValue( "i", 300 ) );
            PyTuple_SetItem( pParm, 1, Py_BuildValue( "i", 500 ) );
            pRetVal = PyEval_CallObject( pFun, pParm );
            PyArg_Parse( pRetVal, "i", &iRetval );
            printf( "result: %d/n", iRetval );
        }
        else
            printf( "Not found fun!/n" );
    }
    else
        printf( "Not found module!/n" );
}

 

int main( void )
{
    Py_Initialize();
    if ( !Py_IsInitialized() )
        return -1;

    try
    {
        PyRun_SimpleString( "import sys" );
        PyRun_SimpleString( "sys.path.append( './' )" );
        PyRun_SimpleString( "print sys.path" );
    }
    catch ( ... )
    {
        printf( "Error to import!" );
    }
   
    test();

    Py_Finalize();  
    return 0;
}

首先,我使用的是python2.6,在測試指令碼調用的程式,DEBUG下需要python26_d.dll和python26_d.lib這兩個調試版的庫。這兩個庫網上有現成的可以下載,也可以自己編譯。當然python的SDK是肯定需要的。這個例子的test函數是我在網上隨便COPY的一份,自己只是整理了下。很多COPY的代碼,我都喜歡自己整理一下,至少看起來更舒服清晰一點。也可以說規範一點。

主函數裡 Py_Initialize();初始化python解譯器,之後是判斷是否初始化成功。紅色的try塊可以用來設定自己的python模組搜尋路徑。PyRun_SimpleString此函數可以很方便的執行一句python指令碼語句。

PyRun_SimpleString( "import sys" );這句相當於在python指令碼裡寫:import sys語句,然後執行。

後面的一個道理,我在這裡使用sys.path.append將預設搜尋路徑設定到當前。當然你可以設定成其他的路徑,可以是相對路徑也可以是絕對路徑。之後我做了一個列印。看看這些路徑都是些什麼。或者你可以直接將你寫好的將要用到CC++中來調用的指令碼(.py)檔案放到其中任意一個path中。在後面的載入模組函數就能夠搜尋到你寫的py檔案了。

這裡我寫的add.py指令檔很簡單,就一個函數:

def add( a, b )

    return a + b

python是以縮排來判斷是否屬於函數體的。我們要在程式中調用這個函數,首先就得載入這個add.py檔案。我將這個檔案放在了工程目錄裡。然後test函數裡使用PyImport_ImportModule 載入add.py檔案。載入成功後,擷取函數指標,這個有那點像尋找dll中的函數,呵呵!pParm = PyTuple_New( 2 );構建add函數的參數元組。之後就是傳入兩參數300和500,"i"表示是整數。之後就是調用改指令碼函數。傳回值最後列印出來,結果就是:800.

好了,這個例子很簡單,就當留個足跡,要擴充的很多。一個基本的調用模型完成了。【待續】

【Python筆記目錄】

1. Python筆記(一)——C/C++調用python

2. Python筆記(二)——python調用C/C++模組

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.