您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么使用Python向C語言的鏈接庫傳遞數組、結構體、指針類型的數據,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向對象的腳本語言,其最初的設計是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發獨立的項目和大型項目。
使用python向C語言的鏈接庫傳遞數組、結構體、指針類型的數據
由于最近的項目頻繁使用python調用同事的C語言代碼,在調用過程中踩了很多坑,一點一點寫出來供大家參考,我們仍然是使用ctypes來調用C語言的代碼庫。
至于如何調用基礎數據類型的數據,請大家參考我的另外一篇文章:Python使用ctypes調用C/C++的方法
1. 使用python給C語言函數傳遞數組類型的參數
想必很多時候,C語言會使用數組作為參數,在之前我們使用過ctypes的一些數據類型作為C語言參數類型,包括byte、short、int、double之類的,但是在使用數組類型的時候,我們也是有著類似的做法,下面我們看實例:
1.1 C語言的代碼塊
一個簡單的數組輸入,以及一個簡單將數組作為參數的函數
int input[2] = [0, 1] void printIntArray(int[] input){ for(int i = 0; i < 2; i ++){ print(input[i]); } }
1.2 python代碼塊
下面我們將演示如何調用上面的代碼
from ctypes import * # 假設上面的代碼被編譯成了一個XXXXlib.so的文件 dll = CDLL('XXXXlib.so') # 聲明一個數組類型 INPUT = c_int * 2 # 實例化一個長度為2的整型數組 input = INPUT() # 為數組賦值(input這個數組是不支持迭代的) input[0] = 1 input[1] = 2 # 引用C語言的函數 print_int_array = dll.printIntArray # 調用C語言的函數 print_int_array(input)
1.3 小結
使用數組的方法基本就是這樣的,聲明什么類型的數組只需要根據之前python官方文檔里ctypes使用說明對照著聲明數組就可以了。
2. 使用python給C語言函數傳遞結構體類型的參數
當然,為了滿足一些個性化的需求和為了使程序更容易讓人理解,更多的時候開發人員也會使用結構體類型的變量為函數賦值。現在我們使用ctypes來實例化一個C語言的結構體,請看實例:
由于第一部分我們已經介紹了如何簡單的調用C語言的函數,我們下面只寫結構體相關的python代碼
from ctypes import * # 聲明一個類,繼承自ctypes.Structure class PythonStructure(Structure): _fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)] # 實例化變量 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
從代碼中我們可以看到,我們聲明了一個class,使其繼承自ctypes.Structure,然后在類的內部聲明了變量,fields這樣一個變量域,里面用元組存貯這結構體的每個結構體內部變量的變量名和數據類型。
然后在實際的使用過程中,首先要實例化一個PythonStructure類型的變量,然后為其各個內部變量賦值。
3. 使用python給C語言函數傳遞指針類型的參數
指針作為C語言相比于其他原因最大的優勢,在C語言程序中會大量的使用指針,因此將指針類型的數據作為參數傳遞其實是十分的普遍的,下面我們直接上實例:
3.1 C語言函數聲明
void test(pystruct *ps)
假設這里的pystruct與我們在第二部分聲明的結構體相對應(我這渣渣C語言功底實在是怕寫出什么錯誤的代碼誤導大家)
3.2 python代碼
使用指針類型的數據只需要在調用btref()
就可以了
from ctypes import * # 聲明一個類,繼承自ctypes.Structure class PythonStructure(Structure): _fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)] # 實例化變量 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 # 開始調用 dll = CDLL('XXXXlib.so') test = dll.test # 傳遞參數 test(byref(python_structure))
關于“怎么使用Python向C語言的鏈接庫傳遞數組、結構體、指針類型的數據”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。