Python中使用ctypes調(diào)用C++的方法
在Python中可以通過(guò)幾種方法調(diào)用C++的函數(shù),這里介紹使用ctypes的方法。ctypes是Python自帶的一個(gè)模塊,能夠直接載入C++生成的動(dòng)態(tài)鏈接庫(kù),并調(diào)用其中的函數(shù)。示例如下
代碼文件:add.cpp
int add(int a, int b) {
return a+b;
}頭文件:add.h
extern "C" int add(int a, int b);
編譯命令
$ g++ -fPIC -shared -o add.so add.cpp
在Ubuntu系統(tǒng)通過(guò)上述編譯命令生成動(dòng)態(tài)鏈接庫(kù)add.so。其中需要輸出的函數(shù)必須定義為extern "C"類型,表示函數(shù)接口以C語(yǔ)言的格式輸出。
在Python中的調(diào)用方法如下
from ctypes import *
lib = cdll.LoadLibrary('./add.so')
a = 5
b = 4
c = lib.add(a,b)
print("a + b = ", c)這是比較簡(jiǎn)單的例子,對(duì)于使用numpy等數(shù)據(jù)類型的函數(shù)則需要更為復(fù)雜的形式,比如對(duì)于兩個(gè)數(shù)組相加的例子
代碼文件:add_arr.cpp
void add_arr(double a[10][10], double b[10][10], double c[10][10]) {
for (int i=0; i<10; i++) {
for (int j=0; j<10; j++) {
c[i][j] = a[i][j] + b[i][j];
}
}
}頭文件:add_arr.h
extern "C" void add_arr(double a[10][10], double b[10][10], double c[10][10]);
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的數(shù)組相加的功能
在Python文件中調(diào)用的方法
from ctypes import *
def double_ptr(arr):
? ? ptr = arr.ctypes.data_as(POINTER(c_double))
? ? return ptr
lib = cdll.LoadLibrary('./add_arr.so')
lib_add_arr = lib.add_arr
lib_add_arr.argtypes = [ ?? ?#指定函數(shù)調(diào)用的參數(shù)形式
?? ?POINTER(c_double), ?? ??? ?#ctypes定義下的指向64位浮點(diǎn)數(shù)的指針
?? ?POINTER(c_double),?
?? ?POINTER(c_double) ]
a = np.random.rand(10,10)
b = np.random.rand(10,10)
c = np.zeros([10,10])
#調(diào)用函數(shù),執(zhí)行數(shù)據(jù)的相加
lib_add_arr(double_ptr(a), double_ptr(b), double_ptr(c))
print("a = \n", a)
print("b = \n", b)
print("c = \n", c)在Python程序中,首先指定調(diào)用函數(shù)的參數(shù)形式,通過(guò)ctypes庫(kù)可以把numpy數(shù)組以數(shù)據(jù)指針的形式傳遞給C++函數(shù),在調(diào)用函數(shù)的時(shí)候,分別把numpy數(shù)組的指針傳遞給函數(shù),即可以在C++函數(shù)中實(shí)現(xiàn)對(duì)兩個(gè)數(shù)組的相加。然后打印數(shù)據(jù)和運(yùn)算結(jié)果。
其中double_ptr是一個(gè)把numpy數(shù)組轉(zhuǎn)為指針的操作符。
到此這篇關(guān)于Python中使用ctypes調(diào)用C++的方法的文章就介紹到這了,更多相關(guān)Python ctypes調(diào)用C++內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas中的日期時(shí)間date處理小結(jié)
Pandas提供了強(qiáng)大的日期和時(shí)間處理功能,本文主要介紹了Pandas中的日期時(shí)間date處理小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04
基于Python實(shí)現(xiàn)溫度單位轉(zhuǎn)換器(新手版)
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)溫度單位轉(zhuǎn)換器,主要是將攝氏溫度(C)和華氏溫度(F)相互轉(zhuǎn)換,下面小編就來(lái)和大家簡(jiǎn)單介紹一下吧2025-08-08
python 迭代器和iter()函數(shù)詳解及實(shí)例
這篇文章主要介紹了python 迭代器和iter()函數(shù)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
Python中shutil模塊的學(xué)習(xí)筆記教程
shutil模塊是一種高層次的文件操作工具,類似于高級(jí)API,主要強(qiáng)大之處在于其對(duì)文件的復(fù)制與刪除操作更是比較支持好。下面這篇文章主要介紹了Python中shutil模塊的相關(guān)教程,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-04-04
Python學(xué)習(xí)筆記(二)基礎(chǔ)語(yǔ)法
對(duì)于任何一門語(yǔ)言的學(xué)習(xí),學(xué)語(yǔ)法是最枯燥無(wú)味的,但又不得不學(xué),基礎(chǔ)概念較繁瑣,本文將不多涉及概念解釋,用例子進(jìn)行相關(guān)解析,適當(dāng)與C語(yǔ)言對(duì)比,避免陷入語(yǔ)法的苦海。我認(rèn)為初學(xué)者學(xué)習(xí)語(yǔ)法的目標(biāo)是學(xué)會(huì)使用即可,關(guān)于對(duì)概念的深入理解,剖析,沒(méi)有一定的知識(shí)積累是很難做到的。2014-06-06
python3如何使用saml2.0協(xié)議接入SSO
SAML是一種用于在不同系統(tǒng)之間傳輸安全聲明的XML框架,通過(guò)IDP和SP之間的重定向訪問(wèn),SP向IDP請(qǐng)求用戶身份認(rèn)證,IDP驗(yàn)證用戶身份后返回SAML應(yīng)答,本文以python3和python3-saml庫(kù)為例,介紹了如何接入公司SSO系統(tǒng),包括配置和處理登錄和登出請(qǐng)求2024-11-11
python 實(shí)現(xiàn)登錄網(wǎng)頁(yè)的操作方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)登錄網(wǎng)頁(yè)的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

