麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Python > 正文

python使用ctypes調用擴展模塊的實例方法

2024-09-09 19:03:40
字體:
來源:轉載
供稿:網友

楔子

我們知道python的執行效率不是很高,而且由于GIL的原因,導致python不能充分利用多核CPU。一般的解決方式是使用多進程,但是多進程開銷比較大,而且進程之間的通信也會比較麻煩。因此在解決效率問題上,我們會把那些比較耗時的模塊使用C或者C++編寫,然后編譯成動態鏈接庫,Windows上面是dll,linux上面則是so,編譯好之后,交給python去調用。而且通過擴展模塊的方式還可以解決python的GIL的問題,因此如果想要利用多核,我們仍然可以通過擴展模塊的方式。

python如何調用擴展模塊

python調用擴展模塊的一種比較簡單的方式就是使用ctypes這個庫,這個庫是python官方提供的,任何一個版本的python都可以使用,我們通過ctypes可以很輕松地調用擴展模塊。

演示

#include <stdio.h>void test(){  printf("hello world/n");}

我們定義了一個很簡單的函數,下面我們就可以將其編譯成擴展模塊了。在Windows是dll,linux上是so,編譯的命令是一樣的。我這里以Windows 為例,記得在Windows上要安裝MinGW,或者安裝VsCode,我這里使用的是MinGW,因為VsCode太大了。

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

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

下面就可以使用python去調用了。

import ctypes# 使用ctypes很簡單,直接import進來,然后使用ctypes.CDLL這個類來加載動態模塊# 如果在Windows上還可以使用ctypes.WinDLL。# 因為看ctypes源碼的話,會發現WinDLL也是一個類并且繼承自CDLL# 所以在linux上使用ctypes.CDLL,# 而在Windows上既可以使用WinDLL、也可以使用CDLL加載動態模塊lib = ctypes.CDLL("./mmp.dll") # 加載之后就得到了擴展模塊# 我們可以直接通過.的方式去調用里面的函數了,會發現成功打印lib.test() # hello world# 但是為了確定是否存在這個函數,我們一般會使用反射去獲取# 因為如果函數不存在通過.的方式調用會拋異常的func = getattr(lib, "test", None)if func:  print(func) # <_FuncPtr object at 0x0000029F75F315F0>  func() # hello world# 不存在test_xx這個函數,所以得到的結果為Nonefunc1 = getattr(lib, "test_xx", None)print(func1) # None

所以使用ctypes去調用擴展模塊非常方便

1.通過ctypes.CDLL("dll或者so的路徑"),如果是Windows還可以使用ctypes.WinDLL("dll路徑")。另外這兩種加載方式分別等價于: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文件的路徑最好是絕對路徑,即便不是也要表明層級,比如我們這里的py文件和dll文件是在同一個目錄下,但是我們加載的時候不可以寫mmp.dll,這樣會報錯找不到,要寫成./mmp.dll。

2.加載動態模塊之后會返回一個對象,我們上面起名為lib,這個lib就是得到的擴展模塊了。

3.然后可以直接通過lib調用里面的函數,但是一般我們會使用反射的方式來獲取,因為不知道函數到底存不存在,如果不存在直接調用會拋出異常,如果存在這個函數我們才會執行。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品无吗乱吗av国产爱色 | 精品偷拍久久 | 国产精品自拍99 | 欧美三级欧美成人高清www | 精品国产1区2区3区 免费国产 | 亚洲人片在线观看 | 亚洲精品久久久久www | 久久久久久久久久久久久久av | 成人三区四区 | 成人精品aaaa网站 | 韩国美女一区 | 国产精品久久久久一区二区 | 日韩av影片在线观看 | 看免费5xxaaa毛片 | 最新av在线免费观看 | 狠狠干五月| 精品亚洲va在线va天堂资源站 | 黄 色 免费网 站 成 人 | 女人裸体让男人桶全过程 | 精品一区二区免费视频视频 | 国产高潮失禁喷水爽到抽搐视频 | 黄色av网站免费 | 久久久www成人免费毛片 | 爱操影院| 国产69精品久久久久久久久久 | 国产亚洲精品视频中文字幕 | 中国产一级毛片 | 欧美一极视频 | 国产人成免费爽爽爽视频 | 欧美扩阴视频 | 性少妇freeseⅹbbwhd | 99精品视频在线免费观看 | 黄色a级片视频 | 91精品久久久久久久久网影视 | 成人aaaa免费全部观看 | 99热久草| 欧美14一15sex性hd | 久久精品国产99久久久古代 | 亚洲福利在线免费观看 | 久久久久久免费 | bt 自拍 另类 综合 欧美 |