溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python調(diào)用c++代碼的方法

發(fā)布時(shí)間:2020-09-23 09:53:17 來(lái)源:億速云 閱讀:349 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)python調(diào)用c++代碼的方法的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

大家都知道Python的優(yōu)點(diǎn)是開(kāi)發(fā)效率高,使用方便,C++則是運(yùn)行效率高,這兩者可以相輔相成,不管是在Python項(xiàng)目中嵌入C++代碼,或是在C++項(xiàng)目中用Python實(shí)現(xiàn)外圍功能,都可能遇到Python調(diào)用C++模塊的需求.

下面列舉出集中c++代碼導(dǎo)出成Python接口的方法,一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。

原生態(tài)導(dǎo)出

Python解釋器就是用C實(shí)現(xiàn),因此只要我們的C++的數(shù)據(jù)結(jié)構(gòu)能讓Python認(rèn)識(shí),理論上就是可以被直接調(diào)用的。我們實(shí)現(xiàn)test1.cpp如下

#include <Python.h>
int 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:生成位置無(wú)關(guān)目標(biāo)代碼,適用于動(dòng)態(tài)連接;
-L path:表示在path目錄中搜索庫(kù)文件,如-L.表示在當(dāng)前目錄;
-I path:表示在path目錄中搜索頭文件;
-o file:制定輸出文件為file;
-shared:生成一個(gè)共享庫(kù)文件;

運(yùn)行Python解釋器,測(cè)試如下

>>> import test1
>>> test1.Add(1,2)
3

這里要注意一下幾點(diǎn)

如果生成的動(dòng)態(tài)庫(kù)名字為test1,則源文件里必須有inittest1這個(gè)函數(shù),且Py_InitModule的第一個(gè)參數(shù)必須是“test1”,否則Python導(dǎo)入模塊會(huì)失敗

如果是cpp源文件,inittest1函數(shù)必須用extern "C"修飾,如果是c源文件,則不需要。原因是Python解釋器在導(dǎo)入庫(kù)時(shí)會(huì)尋找initxxx這樣的函數(shù),而C和C++對(duì)函數(shù)符號(hào)的編碼方式不同,C++在對(duì)函數(shù)符號(hào)進(jìn)行編碼時(shí)會(huì)考慮函數(shù)長(zhǎng)度和參數(shù)類型,具體可以通過(guò)nm test1.so查看函數(shù)符號(hào),c++filt工具可通過(guò)符號(hào)反解出函數(shù)原型

感謝各位的閱讀!關(guān)于python調(diào)用c++代碼的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI