引言
在Python語言中,可以使用ctypes模塊調(diào)用其它如C++語言編寫的動態(tài)鏈接庫DLL文件中的函數(shù),在提高軟件運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數(shù),以擴(kuò)充Python軟件的功能及應(yīng)用領(lǐng)域,減少重復(fù)編寫代碼、重復(fù)造輪子的工作量,這也充分體現(xiàn)了Python語言作為一種膠水語言所特有的優(yōu)勢。
上篇已經(jīng)講了傳遞數(shù)值、指針、字符串參數(shù)的例子,詳細(xì)細(xì)節(jié)請參考:
這次講一下在Python中使用ctypes模塊調(diào)用DLL中的庫函數(shù)傳遞結(jié)構(gòu)體參數(shù)的情況。同樣,操作系統(tǒng)環(huán)境是win7 64位,Python使用的版本是python2.7.14,函數(shù)約定的調(diào)用方式為C調(diào)用(cdecl)方式。
例1:簡單的結(jié)構(gòu)體傳遞參數(shù)示例
這個例子的功能是打印一個學(xué)生的信息,并返回一個指向字符串的指針。其中,學(xué)生信息定義為一個結(jié)構(gòu)體類型,包括學(xué)生的姓名、年齡及分?jǐn)?shù)信息,該函數(shù)的聲明及結(jié)構(gòu)體定義如下圖所示:
函數(shù)printStudentInfo的具體C語言實現(xiàn)代碼如下:
在Python中的調(diào)用方式如下:
從上面的代碼中可以看出,對于結(jié)構(gòu)體參數(shù)的傳遞,在Python中需要使用Structure作為基類定義一個與之對應(yīng)的結(jié)構(gòu)體類Student,在類的_fields中定義結(jié)構(gòu)體中每個成員變量的名稱和數(shù)據(jù)類型。然后定義結(jié)構(gòu)體類的一個實例對象student,對每個成員變量逐個賦值,以byref傳址的方式進(jìn)行調(diào)用就可以了。
例2:復(fù)雜結(jié)構(gòu)體傳遞參數(shù)示例
如果一個結(jié)構(gòu)體里面包括了另一個結(jié)構(gòu)體、指針等綜合要素,情況就要復(fù)雜些了。對上面的例子改進(jìn)一下,定義一個People類,里面包含了一個指向Student類型的指針變量和一個整形變量,在這個結(jié)構(gòu)體中存儲多個學(xué)生的信息及學(xué)生的總數(shù)信息。設(shè)計一個函數(shù)getPeopleInfo獲取每個學(xué)生的信息,并返回所有學(xué)生的個數(shù),該函數(shù)的聲明及結(jié)構(gòu)體定義如下圖所示:
函數(shù)getPeopleInfo的具體C語言實現(xiàn)代碼如下:
在Python中的調(diào)用方式如下:
在上面的代碼中,第43行定義了一個指向Student結(jié)構(gòu)體的指針變量。第48行調(diào)用該函數(shù)并打印返回值,第49-50行,分別打印兩個學(xué)生的具體信息。
完整的測試代碼
完整的測試代碼如下圖所示:
運行結(jié)果如下圖所示:
在上圖中,第1行輸出的是函數(shù)printStudentInfo內(nèi)部的打印信息。