真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python中怎么利用ctypes調(diào)用擴(kuò)展模塊-創(chuàng)新互聯(lián)

這篇文章給大家介紹python中怎么利用ctypes調(diào)用擴(kuò)展模塊,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、花溪網(wǎng)站維護(hù)、網(wǎng)站推廣。

python如何調(diào)用擴(kuò)展模塊

python調(diào)用擴(kuò)展模塊的一種比較簡(jiǎn)單的方式就是使用ctypes這個(gè)庫(kù),這個(gè)庫(kù)是python官方提供的,任何一個(gè)版本的python都可以使用,我們通過ctypes可以很輕松地調(diào)用擴(kuò)展模塊。

演示

#include void test(){  printf("hello world\n");}

我們定義了一個(gè)很簡(jiǎn)單的函數(shù),下面我們就可以將其編譯成擴(kuò)展模塊了。在Windows是dll,linux上是so,編譯的命令是一樣的。我這里以Windows 為例,記得在Windows上要安裝MinGW,或者安裝VsCode,我這里使用的是MinGW,因?yàn)閂sCode太大了。

gcc -o dll文件或者so文件 -shared c或者c++源文件

我這里的C源文件叫做1.c,我們編譯成mmp.dll吧,所以命令就可以這么寫:gcc -o mmp.dll -shared 1.c

下面就可以使用python去調(diào)用了。

import ctypes# 使用ctypes很簡(jiǎn)單,直接import進(jìn)來,然后使用ctypes.CDLL這個(gè)類來加載動(dòng)態(tài)模塊# 如果在Windows上還可以使用ctypes.WinDLL。# 因?yàn)榭碿types源碼的話,會(huì)發(fā)現(xiàn)WinDLL也是一個(gè)類并且繼承自CDLL# 所以在linux上使用ctypes.CDLL,# 而在Windows上既可以使用WinDLL、也可以使用CDLL加載動(dòng)態(tài)模塊lib = ctypes.CDLL("./mmp.dll") # 加載之后就得到了擴(kuò)展模塊# 我們可以直接通過.的方式去調(diào)用里面的函數(shù)了,會(huì)發(fā)現(xiàn)成功打印lib.test() # hello world# 但是為了確定是否存在這個(gè)函數(shù),我們一般會(huì)使用反射去獲取# 因?yàn)槿绻瘮?shù)不存在通過.的方式調(diào)用會(huì)拋異常的func = getattr(lib, "test", None)if func:  print(func) # <_FuncPtr object at 0x0000029F75F315F0>  func() # hello world# 不存在test_xx這個(gè)函數(shù),所以得到的結(jié)果為Nonefunc1 = getattr(lib, "test_xx", None)print(func1) # None

所以使用ctypes去調(diào)用擴(kuò)展模塊非常方便

1.通過ctypes.CDLL("dll或者so的路徑"),如果是Windows還可以使用ctypes.WinDLL("dll路徑")。另外這兩種加載方式分別等價(jià)于:ctypes.CDLL("dll或者so的路徑") == ctypes.cdll.LoadLibrary("dll或者so的路徑"),ctypes.WinDLL("dll路徑") == ctypes.windll.LoadLibrary("dll路徑")。但是注意的是:linux上只能使用ctypes.CDLL和ctypes.cdll.LoadLibrary,而Windows上ctypes.CDLL、ctypes.cdll.LoadLibrary、ctypes.WinDLL、ctypes.windll.LoadLibrary都可以使用。但是一般我們都使用ctypes.CDLL即可,另外注意的是:dll或者so文件的路徑好是絕對(duì)路徑,即便不是也要表明層級(jí),比如我們這里的py文件和dll文件是在同一個(gè)目錄下,但是我們加載的時(shí)候不可以寫mmp.dll,這樣會(huì)報(bào)錯(cuò)找不到,要寫成./mmp.dll。

2.加載動(dòng)態(tài)模塊之后會(huì)返回一個(gè)對(duì)象,我們上面起名為lib,這個(gè)lib就是得到的擴(kuò)展模塊了。

3.然后可以直接通過lib調(diào)用里面的函數(shù),但是一般我們會(huì)使用反射的方式來獲取,因?yàn)椴恢篮瘮?shù)到底存不存在,如果不存在直接調(diào)用會(huì)拋出異常,如果存在這個(gè)函數(shù)我們才會(huì)執(zhí)行。

關(guān)于python中怎么利用ctypes調(diào)用擴(kuò)展模塊就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。


本文題目:python中怎么利用ctypes調(diào)用擴(kuò)展模塊-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://weahome.cn/article/ddedei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部