這篇文章給大家分享的是有關(guān)python調(diào)用c++代碼的方法的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。
公司主營業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出玉門免費(fèi)做網(wǎng)站回饋大家。
大家都知道Python的優(yōu)點(diǎn)是開發(fā)效率高,使用方便,C++則是運(yùn)行效率高,這兩者可以相輔相成,不管是在Python項(xiàng)目中嵌入C++代碼,或是在C++項(xiàng)目中用Python實(shí)現(xiàn)外圍功能,都可能遇到Python調(diào)用C++模塊的需求.
下面列舉出集中c++代碼導(dǎo)出成Python接口的方法,一起來學(xué)習(xí)學(xué)習(xí)吧。
原生態(tài)導(dǎo)出
Python解釋器就是用C實(shí)現(xiàn),因此只要我們的C++的數(shù)據(jù)結(jié)構(gòu)能讓Python認(rèn)識,理論上就是可以被直接調(diào)用的。我們實(shí)現(xiàn)test1.cpp如下
#includeint Add(int x, int y) { return x + y; } int Del(int x, int y) { return x - y; } PyObject* WrappAdd(PyObject* self, PyObject* args) { int x, y; if (!PyArg_ParseTuple(args, "ii", &x, &y)) { return NULL; } return Py_BuildValue("i", Add(x, y)); } PyObject* WrappDel(PyObject* self, PyObject* args) { int x, y; if (!PyArg_ParseTuple(args, "ii", &x, &y)) { return NULL; } return Py_BuildValue("i", Del(x, y)); } static PyMethodDef test_methods[] = { {"Add", WrappAdd, METH_VARARGS, "something"}, {"Del", WrappDel, METH_VARARGS, "something"}, {NULL, NULL} }; extern "C" void inittest1() { Py_InitModule("test1", test_methods); }
編譯命令如下
g++ -fPIC -shared test1.cpp -I/usr/include/python2.7 -o test1.so
-fPIC:生成位置無關(guān)目標(biāo)代碼,適用于動態(tài)連接;
-L path:表示在path目錄中搜索庫文件,如-L.表示在當(dāng)前目錄;
-I path:表示在path目錄中搜索頭文件;
-o file:制定輸出文件為file;
-shared:生成一個(gè)共享庫文件;
運(yùn)行Python解釋器,測試如下
>>> import test1 >>> test1.Add(1,2) 3
這里要注意一下幾點(diǎn)
如果生成的動態(tài)庫名字為test1,則源文件里必須有inittest1這個(gè)函數(shù),且Py_InitModule的第一個(gè)參數(shù)必須是“test1”,否則Python導(dǎo)入模塊會失敗
如果是cpp源文件,inittest1函數(shù)必須用extern "C"修飾,如果是c源文件,則不需要。原因是Python解釋器在導(dǎo)入庫時(shí)會尋找initxxx這樣的函數(shù),而C和C++對函數(shù)符號的編碼方式不同,C++在對函數(shù)符號進(jìn)行編碼時(shí)會考慮函數(shù)長度和參數(shù)類型,具體可以通過nm test1.so查看函數(shù)符號,c++filt工具可通過符號反解出函數(shù)原型
感謝各位的閱讀!關(guān)于python調(diào)用c++代碼的方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!