最近因為研究一個東西,並且在很久以前就想把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++模組