python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...
在Python語(yǔ)言中,可以使用ctypes模塊調(diào)用其它如C++語(yǔ)言編寫(xiě)的動(dòng)態(tài)鏈接庫(kù)DLL文件中的函數(shù),在提高軟件運(yùn)行效率的同時(shí),也可以充分利用目前市面上各種第三方的DLL庫(kù)函數(shù),以擴(kuò)充Python軟件的功能及應(yīng)用領(lǐng)域,減少重復(fù)編寫(xiě)代碼、重復(fù)造輪子的工作量,這也充分體現(xiàn)了Python語(yǔ)言作為一種膠水語(yǔ)言所特有的優(yōu)勢(shì)。
這次以具體的例子講一下在Python中,如何使用ctypes模塊調(diào)用DLL中的庫(kù)函數(shù)。本文的編程系統(tǒng)環(huán)境是win7 64位,Python使用的版本是python2.7.14。
由于DLL中函數(shù)中傳遞的參數(shù)類(lèi)型比較多樣化,擬打算分三次講解這部分內(nèi)容,這次先講傳遞數(shù)值、指針與字符串參數(shù)的情況,后面再分兩次講解傳遞結(jié)構(gòu)體、數(shù)值數(shù)組等類(lèi)型的情況。
DLL文件的加載
假定已經(jīng)有了一個(gè)DLL文件“MyDll.dll”,其函數(shù)約定的調(diào)用方式為C調(diào)用(cdecl)方式,則Python中加載該dll文件的代碼如下:
其中,第1行是引入ctypes模塊,第2行是采用C調(diào)用約定加載“MyDll.dll”文件,并將返回值賦給dll變量,后續(xù)調(diào)用該DLL文件中的函數(shù)時(shí),會(huì)使用該變量定義要使用的具體函數(shù)。
另外,需要說(shuō)明的是,若DLL函數(shù)的調(diào)用約定是標(biāo)準(zhǔn)調(diào)用約定(stdcall)方式,則DLL文件的加載代碼改為如下:
dll = WinDLL('MyDll.dll')
DLL函數(shù)的調(diào)用——函數(shù)參數(shù)為數(shù)值情況
如對(duì)于“MyDll.dll”文件中的函數(shù)add,其函數(shù)聲明如下:
該函數(shù)有兩個(gè)int類(lèi)型的輸入?yún)?shù)數(shù)x和y,返回的兩個(gè)數(shù)的和。其C語(yǔ)言的實(shí)現(xiàn)代碼如下:
在Python中的調(diào)用方式如下:
這個(gè)函數(shù)應(yīng)該說(shuō)是最簡(jiǎn)單的一個(gè)函數(shù)了,在第17行,直接使用第一步加載DLL后返回的名稱dll,后面跟函數(shù)名字即可返回其值。
DLL函數(shù)的調(diào)用——函數(shù)參數(shù)為指針情況
對(duì)于上面的函數(shù)改進(jìn)為add2,其函數(shù)C語(yǔ)言的實(shí)現(xiàn)代碼如下:
此時(shí)函數(shù)有三個(gè)指向int類(lèi)型的指針參數(shù)x、y、z,z為x和y的和。
在Python中的調(diào)用方式如下:
其中,第20-22行定義了3個(gè)int型的變量x、y和z,初始值分別為2,3,0。第23行調(diào)用add2函數(shù)時(shí),使用byref指明參數(shù)傳遞時(shí)為引用傳遞,對(duì)應(yīng)著C語(yǔ)言的指針傳遞。函數(shù)運(yùn)行后,使用z.value即可查看z的值。
也可以使用下面的代碼調(diào)用:
上面代碼中,第23-24行,在使用add2函數(shù)時(shí),先將函數(shù)賦給一個(gè)變量add2,然后對(duì)其輸入輸出參數(shù)進(jìn)行單獨(dú)聲明,使用POINTER聲明為這三個(gè)參數(shù)為指向int類(lèi)型的指針變量。
DLL函數(shù)的調(diào)用——函數(shù)參數(shù)為字符串情況
例1:
如對(duì)于下面的函數(shù),返回一個(gè)輸入字符串的字節(jié)長(zhǎng)度,其函數(shù)C語(yǔ)言的實(shí)現(xiàn)代碼如下:
在Python中的調(diào)用代碼如下:
其中,第33行使用c_char_p定義了一個(gè)指向char型的指針變量pStr,并賦初值為’abcdef’,第34行將其傳入GetStringLength函數(shù)返回其長(zhǎng)度。
也可以使用下面代碼調(diào)用:
將GetStringLength函數(shù)的輸入輸出參數(shù)分別使用argtypes和restype單獨(dú)進(jìn)行聲明。
例2:
如對(duì)于下面的函數(shù),輸入輸出皆為字符串指針,函數(shù)的功能是對(duì)于輸入pStr1賦值為“StrIn”,對(duì)于輸出返回一個(gè)指向字符串常量“strOut”的指針,其函數(shù)C語(yǔ)言的實(shí)現(xiàn)代碼如下:
在Python中的調(diào)用代碼如下:
在上面代碼中,同樣分別對(duì)輸入輸出參數(shù)進(jìn)行了聲明。對(duì)于輸入?yún)?shù)pStr,使用create_string_buffer函數(shù)定義了一個(gè)字符串緩沖區(qū)。對(duì)于返回值pChar,在打印輸出結(jié)果時(shí),將其強(qiáng)制轉(zhuǎn)換為c_char_p類(lèi)型,取其value值即可。
完整的測(cè)試代碼
完整的測(cè)試代碼如下圖所示:
運(yùn)行結(jié)果如下圖所示:
總結(jié)
這次的例子基本涵蓋了在Python中通過(guò)ctypes模塊調(diào)用DLL函數(shù)時(shí),傳遞數(shù)值、指針、字符串類(lèi)型參數(shù)時(shí)的大部分情況。要注意的是,使用ctypes映射C語(yǔ)言中的數(shù)據(jù)類(lèi)型時(shí),兩者必須完全一致。下面是Python的ctypes模塊中數(shù)據(jù)類(lèi)型與C語(yǔ)言中數(shù)據(jù)類(lèi)型對(duì)照表:
歡迎加關(guān)注,共同交流。
總結(jié)
以上是生活随笔為你收集整理的python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安康看不孕不育比较好的医院推荐
- 下一篇: python xlwt写入已有表_Pyt