使用Python向C語言的鏈接庫傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)
使用python向C語言的鏈接庫傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)
由于最近的項(xiàng)目頻繁使用python調(diào)用同事的C語言代碼,在調(diào)用過程中踩了很多坑,一點(diǎn)一點(diǎn)寫出來供大家參考,我們?nèi)匀皇鞘褂胏types來調(diào)用C語言的代碼庫。
至于如何調(diào)用基礎(chǔ)數(shù)據(jù)類型的數(shù)據(jù),請(qǐng)大家參考我的另外一篇文章:Python使用ctypes調(diào)用C/C++的方法
1. 使用python給C語言函數(shù)傳遞數(shù)組類型的參數(shù)
想必很多時(shí)候,C語言會(huì)使用數(shù)組作為參數(shù),在之前我們使用過ctypes的一些數(shù)據(jù)類型作為C語言參數(shù)類型,包括byte、short、int、double之類的,但是在使用數(shù)組類型的時(shí)候,我們也是有著類似的做法,下面我們看實(shí)例:
1.1 C語言的代碼塊
一個(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ù)組類型 INPUT = c_int * 2 # 實(shí)例化一個(gè)長(zhǎng)度為2的整型數(shù)組 input = INPUT() # 為數(shù)組賦值(input這個(gè)數(shù)組是不支持迭代的) input[0] = 1 input[1] = 2 # 引用C語言的函數(shù) print_int_array = dll.printIntArray # 調(diào)用C語言的函數(shù) print_int_array(input)
1.3 小結(jié)
使用數(shù)組的方法基本就是這樣的,聲明什么類型的數(shù)組只需要根據(jù)之前python官方文檔里ctypes使用說明對(duì)照著聲明數(shù)組就可以了。
2. 使用python給C語言函數(shù)傳遞結(jié)構(gòu)體類型的參數(shù)
當(dāng)然,為了滿足一些個(gè)性化的需求和為了使程序更容易讓人理解,更多的時(shí)候開發(fā)人員也會(huì)使用結(jié)構(gòu)體類型的變量為函數(shù)賦值?,F(xiàn)在我們使用ctypes來實(shí)例化一個(gè)C語言的結(jié)構(gòu)體,請(qǐng)看實(shí)例:
由于第一部分我們已經(jīng)介紹了如何簡(jiǎn)單的調(diào)用C語言的函數(shù),我們下面只寫結(jié)構(gòu)體相關(guān)的python代碼
from ctypes import * # 聲明一個(gè)類,繼承自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,然后在類的內(nèi)部聲明了變量,fields這樣一個(gè)變量域,里面用元組存貯這結(jié)構(gòu)體的每個(gè)結(jié)構(gòu)體內(nèi)部變量的變量名和數(shù)據(jù)類型。
然后在實(shí)際的使用過程中,首先要實(shí)例化一個(gè)PythonStructure類型的變量,然后為其各個(gè)內(nèi)部變量賦值。
3. 使用python給C語言函數(shù)傳遞指針類型的參數(shù)
指針作為C語言相比于其他原因最大的優(yōu)勢(shì),在C語言程序中會(huì)大量的使用指針,因此將指針類型的數(shù)據(jù)作為參數(shù)傳遞其實(shí)是十分的普遍的,下面我們直接上實(shí)例:
3.1 C語言函數(shù)聲明
void test(pystruct *ps)
假設(shè)這里的pystruct與我們?cè)诘诙糠致暶鞯慕Y(jié)構(gòu)體相對(duì)應(yīng)(我這渣渣C語言功底實(shí)在是怕寫出什么錯(cuò)誤的代碼誤導(dǎo)大家)
3.2 python代碼
使用指針類型的數(shù)據(jù)只需要在調(diào)用btref()
就可以了
from ctypes import * # 聲明一個(gè)類,繼承自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 # 開始調(diào)用 dll = CDLL('XXXXlib.so') test = dll.test # 傳遞參數(shù) test(byref(python_structure))
4.寫在最后
以上就是我們今天踩過的坑,其實(shí)發(fā)現(xiàn)網(wǎng)上對(duì)于ctypes的相關(guān)文章不是很多,因此想寫出來跟大家分享一下,希望大家少踩坑,快速的完成任務(wù),遠(yuǎn)離加班,周末愉快!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Python利用卡方Chi特征檢驗(yàn)實(shí)現(xiàn)提取關(guān)鍵文本特征
卡方檢驗(yàn)最基本的思想就是通過觀察實(shí)際值與理論值的偏差來確定理論的正確與否。本文將利用卡方Chi特征檢驗(yàn)實(shí)現(xiàn)提取關(guān)鍵文本特征功能,感興趣的可以了解一下2022-12-12解決Django的request.POST獲取不到內(nèi)容的問題
今天小編就為大家分享一篇解決Django的request.POST獲取不到內(nèi)容的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python+Pygame實(shí)現(xiàn)懷舊游戲飛機(jī)大戰(zhàn)
第一次見到飛機(jī)大戰(zhàn)是在小學(xué)五年級(jí)下半學(xué)期的時(shí)候,這個(gè)游戲中可以說包含了幾乎所有我目前可接觸到的pygame知識(shí)。本文就來利用Pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,需要的可以參考一下2022-11-11Python?中如何將十六進(jìn)制轉(zhuǎn)換為?Base64
本篇文章將介紹在?Python?中將?hex?轉(zhuǎn)換為?base64?的方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06Python自動(dòng)化辦公之生成PDF報(bào)告詳解
因?yàn)楣ぷ餍枰?jīng)常需要生成很多的PDF報(bào)告給客戶查看產(chǎn)品效果以及過程的講解,每次都需要按照一定的格式的編寫文檔并生成PDF報(bào)告,這樣重復(fù)性的工作實(shí)在太累。本文就來用Python實(shí)現(xiàn)自動(dòng)生成PDF報(bào)告吧2023-03-03pandas刪除行刪除列增加行增加列的實(shí)現(xiàn)
這篇文章主要介紹了pandas刪除行刪除列增加行增加列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Django 權(quán)限認(rèn)證(根據(jù)不同的用戶,設(shè)置不同的顯示和訪問權(quán)限)
這篇文章主要介紹了Django 權(quán)限認(rèn)證(根據(jù)不同的用戶,設(shè)置不同的顯示和訪問權(quán)限),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07VSCode安裝Django插件后實(shí)現(xiàn)html語法提示的方法步驟
Vscode是微軟推出的一款優(yōu)秀的ide開發(fā)工具,界面簡(jiǎn)潔美觀、默認(rèn)支持中文,擁有豐富的插件,支持Windows,OS X和Linux,下面這篇文章主要給大家介紹了關(guān)于VSCode安裝Django插件后實(shí)現(xiàn)html語法提示的方法步驟,需要的朋友可以參考下2022-08-08