c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...
在Python語言中,可以使用ctypes模塊調(diào)用其它如C++語言編寫的動態(tài)鏈接庫DLL文件中的函數(shù),在提高軟件運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數(shù),以擴充Python軟件的功能及應用領(lǐng)域,減少重復編寫代碼、重復造輪子的工作量,這也充分體現(xiàn)了Python語言作為一種膠水語言所特有的優(yōu)勢。
前面兩篇已經(jīng)講了傳遞數(shù)值/指針/字符串參數(shù)、傳遞結(jié)構(gòu)體參數(shù)的例子,大家可以回看一下,這樣可以更好的理解本次要講的內(nèi)容。詳細細節(jié)請參考:python使用ctypes模塊調(diào)用DLL函數(shù)之傳遞數(shù)值、指針與字符串參數(shù)、Python使用ctypes模塊調(diào)用DLL函數(shù)之傳遞結(jié)構(gòu)體參數(shù)
這次講一下在Python中使用ctypes模塊調(diào)用DLL中的庫函數(shù)傳遞數(shù)組參數(shù)的情況。一般情況下,DLL函數(shù)中傳遞C語言類型的數(shù)組,在接收到Python語言中時,通常將其轉(zhuǎn)換為numpy庫里面的數(shù)組類型,這樣做的好處是可以借助于numpy強大的分析處理功能對數(shù)據(jù)直接作后續(xù)處理。這次通過例子演示下C語言數(shù)組到numpy數(shù)組之間是怎樣傳遞的。
同樣,操作系統(tǒng)環(huán)境是win7 64位,Python使用的版本是python2.7.14,函數(shù)約定的調(diào)用方式為C調(diào)用(cdecl)方式。
例子說明
在DLL文件中設(shè)計一個函數(shù)GenSine,其功能是根據(jù)給定的參數(shù)(包括數(shù)據(jù)點數(shù)N、信號頻率f、采樣頻率Fs、信號幅值A(chǔ)、初始相位initPhase、偏移offset等參數(shù))產(chǎn)生一個正弦波形數(shù)據(jù),返回時間向量數(shù)組x(橫坐標數(shù)據(jù))和波形數(shù)據(jù)y(縱坐標數(shù)據(jù))。該函數(shù)的聲明如下圖所示:
函數(shù)GenSine的具體C語言實現(xiàn)代碼如下:
下面給出兩種Python中轉(zhuǎn)為numpy數(shù)組的調(diào)用方法。
Python中調(diào)用方法1
在Python中的調(diào)用方式如下:
上面的代碼中在聲明函數(shù)的參數(shù)類型時,對于前兩個參數(shù)x和y數(shù)組變量,將其聲明為指向double類型的指針即可。在調(diào)用該函數(shù)時,先聲明兩個numpy庫中的數(shù)組t1、y1,數(shù)據(jù)類型為float64,將其作為參數(shù)傳遞到該函數(shù)中時,使用的是numpy中的ctypes.data_as(POINT(c_double))轉(zhuǎn)化為C語言中的指向double類型的指針類型,這樣就可以實現(xiàn)numpy中數(shù)組與C語言數(shù)組中的完美轉(zhuǎn)換。
Python中調(diào)用方法2
在Python中的調(diào)用方式如下:
與第1種方法不同的是,這種方法在聲明函數(shù)的參數(shù)類型時,對于前兩個參數(shù)x和y數(shù)組變量,使用np.ctypeslib.ndpointer(dtype=np.float64,ndim=1,flags="C_CONTIGUOUS")直接將numpy中的數(shù)組聲明為C語言中的數(shù)組類型,最后調(diào)用時,直接將將numpy中的數(shù)組類型t2和y2傳到該函數(shù)中即可。相比于第1種方法,雖然在聲明時麻煩些,但在調(diào)用時可以直接使用numpy中的數(shù)組類型,相對來說要簡潔些,畢竟函數(shù)聲明只需聲明一次即可,但調(diào)用函數(shù)可能會在程序中出現(xiàn)多次。
完整的測試代碼
在測試程序中,使用了pyqtgraph庫畫兩種方法產(chǎn)生的正弦波形圖,不明白的可以翻看下前面的文章,專門介紹了該庫的畫圖方法。詳細可參考:Python使用pyqtgraph庫實現(xiàn)數(shù)據(jù)可視化之多條曲線繪制方法
完整的測試代碼如下圖所示:
運行結(jié)果如下圖所示:
從運行結(jié)果可以看出,兩種調(diào)用方法,都可以實現(xiàn)C語言數(shù)組與numpy數(shù)組之間數(shù)據(jù)正確的傳遞。相比來說,第2種方法更簡潔些。
歡迎加關(guān)注,共同交流。
總結(jié)
以上是生活随笔為你收集整理的c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux收回用户执行权限,Linux之
- 下一篇: iphone储存空间系统怎么清理_教你快