本文主要研究的是使用C++擴(kuò)展Python的功能的相關(guān)問題,具體如下。
環(huán)境
VS2005Python2.5.4Windows7(32位)
簡介
長話短說,這里說的擴(kuò)展Python功能與直接用其它語言寫一個(gè)動(dòng)態(tài)鏈接庫,然后讓Python來調(diào)用有點(diǎn)不一樣(雖然本質(zhì)是一樣的)。而是指使用Python本身提供的API,使用C++來對(duì)Python進(jìn)行功能性擴(kuò)展,可以這樣理解,使用更高效的語言實(shí)現(xiàn)一些算法計(jì)算等等需要更高執(zhí)行效率的核心(或者需要與系統(tǒng)進(jìn)行密切交互的)模塊,然后讓Python像調(diào)用內(nèi)建標(biāo)準(zhǔn)庫的方式來調(diào)用這些模塊,聽起來是不是很誘人?!在軟件技術(shù)高速發(fā)展的今天,借助幾種計(jì)算機(jī)語言來實(shí)現(xiàn)一個(gè)系統(tǒng)的例子數(shù)不勝數(shù),目的不外乎就是性能和便利的平衡。譬如本文要討論的使用C++來擴(kuò)展Python就是Python和C++的一種巧妙的有機(jī)結(jié)合,好處不言而喻,既可以獲得和C++相似的執(zhí)行性能,又可以利用Python的開發(fā)靈活性。由于Python本身是使用C實(shí)現(xiàn)的,二者結(jié)合起來還是比較容易的。
基本流程
本文不適合這樣的讀者——對(duì)Python完全不了解或者對(duì)C/C++完全不了解,道理你們懂的。另外就是Python里面有6種基本數(shù)據(jù)類型。你需要了解如何在C和Python之間對(duì)這些類型進(jìn)行轉(zhuǎn)化(這不在本文討論范圍,可以參考[1])。
言歸正傳,感覺前面說得太多了,實(shí)際上很簡單,因此我決定少說多做。一個(gè)C++的Python擴(kuò)展模塊至少應(yīng)該有導(dǎo)出函數(shù),方法列表和初始化函數(shù)三個(gè)部分。我們用VS2005這個(gè)強(qiáng)大的工具開工!一般來說,你應(yīng)該建一個(gè)Dll工程(至于使用exe來擴(kuò)展Python可以不可以,暫時(shí)還沒研究過)。下面按部就班的說明(關(guān)鍵說明在注釋部分)。
一、初始化函數(shù)
//-------------------------------------------------------------------------// 函數(shù) : initPyExt// 功能 : 初始化函數(shù)// 返回值 :PyMODINIT_FUNC// 附注 : 注意,這個(gè)函數(shù)的名字不能改動(dòng)。必須是init+模塊名字,// 我們的模塊名字是PyExt,所以函數(shù)名是initPyExt。Python在導(dǎo)入// 我們的PyExt模塊時(shí),會(huì)找到這個(gè)函數(shù),并調(diào)用。這個(gè)函數(shù)實(shí)現(xiàn)的// 功能很簡單,通過調(diào)用Py_InitModule將模塊名字和映射表結(jié)合起// 來,它的意思是說PyExt這個(gè)模塊使用PyExtMethods這個(gè)映射表。//-------------------------------------------------------------------------PyMODINIT_FUNCinitPyExt(){ Py_InitModule("PyExt",PyExtMethods);}二、方法列表
/* 方法列表,這個(gè)是一個(gè)C結(jié)構(gòu)數(shù)組。把需要擴(kuò)展的函數(shù)都映射到這個(gè)表里。 那么Python就知道你的這個(gè)擴(kuò)展模塊支持一些什么方法了。表的第一個(gè)字 段是方法名字,也是通過Python來調(diào)用時(shí)的名字。第二個(gè)字段是導(dǎo)出函數(shù), 是真正調(diào)用的函數(shù),也是C/C++實(shí)現(xiàn)的函數(shù)。第三個(gè)參數(shù)是指明Python向 C/C++函數(shù)傳遞參數(shù)的形式??蛇x的兩種方式是METH_VARARGS和 METH_KEYWORDS,其中METH_VARARGS是參數(shù)傳遞的標(biāo)準(zhǔn)形式,它通 過Python的元組在Python解釋器和C函數(shù)之間傳遞參數(shù),若采用 METH_KEYWORD方式,則Python解釋器和C函數(shù)之間將通過Python的字典 類型在兩者之間進(jìn)行參數(shù)傳遞。第四個(gè)字段是這個(gè)函數(shù)的說明。如果你在 python里來help這個(gè)函數(shù),將顯示這個(gè)說明。相當(dāng)于在python里的函數(shù)的文檔說明。*/staticPyMethodDefPyExtMethods[]={ {"Add", Add,METH_VARARGS,"Addtwo number - edit by magictong."}, {"ExecSystem",ExecSystem,METH_VARARGS,"Execute a shell command - edit bymagictong." }, {NULL,NULL, 0,NULL}};
新聞熱點(diǎn)
疑難解答
圖片精選