這篇文章將為大家詳細(xì)講解有關(guān)怎么使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類(lèi)型的數(shù)據(jù),小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)技術(shù)團(tuán)隊(duì)10多年來(lái)致力于為客戶(hù)提供網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、成都品牌網(wǎng)站建設(shè)、成都全網(wǎng)營(yíng)銷(xiāo)推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了千余家網(wǎng)站,包括各類(lèi)中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。python是什么意思Python是一種跨平臺(tái)的、具有解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語(yǔ)言,其最初的設(shè)計(jì)是用于編寫(xiě)自動(dòng)化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開(kāi)發(fā)獨(dú)立的項(xiàng)目和大型項(xiàng)目。
使用python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類(lèi)型的數(shù)據(jù)
由于最近的項(xiàng)目頻繁使用python調(diào)用同事的C語(yǔ)言代碼,在調(diào)用過(guò)程中踩了很多坑,一點(diǎn)一點(diǎn)寫(xiě)出來(lái)供大家參考,我們?nèi)匀皇鞘褂胏types來(lái)調(diào)用C語(yǔ)言的代碼庫(kù)。
至于如何調(diào)用基礎(chǔ)數(shù)據(jù)類(lèi)型的數(shù)據(jù),請(qǐng)大家參考我的另外一篇文章:Python使用ctypes調(diào)用C/C++的方法
1. 使用python給C語(yǔ)言函數(shù)傳遞數(shù)組類(lèi)型的參數(shù)
想必很多時(shí)候,C語(yǔ)言會(huì)使用數(shù)組作為參數(shù),在之前我們使用過(guò)ctypes的一些數(shù)據(jù)類(lèi)型作為C語(yǔ)言參數(shù)類(lèi)型,包括byte、short、int、double之類(lèi)的,但是在使用數(shù)組類(lèi)型的時(shí)候,我們也是有著類(lèi)似的做法,下面我們看實(shí)例:
1.1 C語(yǔ)言的代碼塊
一個(gè)簡(jiǎn)單的數(shù)組輸入,以及一個(gè)簡(jiǎn)單將數(shù)組作為參數(shù)的函數(shù)
int input[2] = [0, 1] void printIntArray(int[] input){ for(int i = 0; i < 2; i ++){ print(input[i]); } }
1.2 python代碼塊
下面我們將演示如何調(diào)用上面的代碼
from ctypes import * # 假設(shè)上面的代碼被編譯成了一個(gè)XXXXlib.so的文件 dll = CDLL('XXXXlib.so') # 聲明一個(gè)數(shù)組類(lèi)型 INPUT = c_int * 2 # 實(shí)例化一個(gè)長(zhǎng)度為2的整型數(shù)組 input = INPUT() # 為數(shù)組賦值(input這個(gè)數(shù)組是不支持迭代的) input[0] = 1 input[1] = 2 # 引用C語(yǔ)言的函數(shù) print_int_array = dll.printIntArray # 調(diào)用C語(yǔ)言的函數(shù) print_int_array(input)
1.3 小結(jié)
使用數(shù)組的方法基本就是這樣的,聲明什么類(lèi)型的數(shù)組只需要根據(jù)之前python官方文檔里ctypes使用說(shuō)明對(duì)照著聲明數(shù)組就可以了。
2. 使用python給C語(yǔ)言函數(shù)傳遞結(jié)構(gòu)體類(lèi)型的參數(shù)
當(dāng)然,為了滿(mǎn)足一些個(gè)性化的需求和為了使程序更容易讓人理解,更多的時(shí)候開(kāi)發(fā)人員也會(huì)使用結(jié)構(gòu)體類(lèi)型的變量為函數(shù)賦值?,F(xiàn)在我們使用ctypes來(lái)實(shí)例化一個(gè)C語(yǔ)言的結(jié)構(gòu)體,請(qǐng)看實(shí)例:
由于第一部分我們已經(jīng)介紹了如何簡(jiǎn)單的調(diào)用C語(yǔ)言的函數(shù),我們下面只寫(xiě)結(jié)構(gòu)體相關(guān)的python代碼
from ctypes import * # 聲明一個(gè)類(lèi),繼承自ctypes.Structure class PythonStructure(Structure): _fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)] # 實(shí)例化變量 python_structure = PythonStructure() # 賦值 python_structure.param1 = 1 python_structure.param2 = 3 PARAM = c_int * 2 param3 = PARAM() param3[0] = 3 param3[1] = 4 python_structure.param3 = param3
從代碼中我們可以看到,我們聲明了一個(gè)class,使其繼承自ctypes.Structure,然后在類(lèi)的內(nèi)部聲明了變量,fields這樣一個(gè)變量域,里面用元組存貯這結(jié)構(gòu)體的每個(gè)結(jié)構(gòu)體內(nèi)部變量的變量名和數(shù)據(jù)類(lèi)型。
然后在實(shí)際的使用過(guò)程中,首先要實(shí)例化一個(gè)PythonStructure類(lèi)型的變量,然后為其各個(gè)內(nèi)部變量賦值。
3. 使用python給C語(yǔ)言函數(shù)傳遞指針類(lèi)型的參數(shù)
指針作為C語(yǔ)言相比于其他原因大的優(yōu)勢(shì),在C語(yǔ)言程序中會(huì)大量的使用指針,因此將指針類(lèi)型的數(shù)據(jù)作為參數(shù)傳遞其實(shí)是十分的普遍的,下面我們直接上實(shí)例:
3.1 C語(yǔ)言函數(shù)聲明
void test(pystruct *ps)
假設(shè)這里的pystruct與我們?cè)诘诙糠致暶鞯慕Y(jié)構(gòu)體相對(duì)應(yīng)(我這渣渣C語(yǔ)言功底實(shí)在是怕寫(xiě)出什么錯(cuò)誤的代碼誤導(dǎo)大家)
3.2 python代碼
使用指針類(lèi)型的數(shù)據(jù)只需要在調(diào)用btref()
就可以了
from ctypes import * # 聲明一個(gè)類(lèi),繼承自ctypes.Structure class PythonStructure(Structure): _fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)] # 實(shí)例化變量 python_structure = PythonStructure() # 賦值 python_structure.param1 = 1 python_structure.param2 = 3 PARAM = c_int * 2 param3 = PARAM() param3[0] = 3 param3[1] = 4 python_structure.param3 = param3 # 開(kāi)始調(diào)用 dll = CDLL('XXXXlib.so') test = dll.test # 傳遞參數(shù) test(byref(python_structure))
關(guān)于“怎么使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類(lèi)型的數(shù)據(jù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
本文題目:怎么使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類(lèi)型的數(shù)據(jù)-創(chuàng)新互聯(lián)
分享URL:http://aaarwkj.com/article26/gddjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、軟件開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)、微信小程序、定制開(kāi)發(fā)、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容