欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年01月28日 14:23:03   作者:古明地盆  
在本篇文章里小編給大家整理的是一篇關于python使用ctypes調用擴展模塊的實例方法內容,需要的朋友們可以學習參考下。

楔子

我們知道python的執(zhí)行效率不是很高,而且由于GIL的原因,導致python不能充分利用多核CPU。一般的解決方式是使用多進程,但是多進程開銷比較大,而且進程之間的通信也會比較麻煩。因此在解決效率問題上,我們會把那些比較耗時的模塊使用C或者C++編寫,然后編譯成動態(tài)鏈接庫,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這個類來加載動態(tài)模塊
# 如果在Windows上還可以使用ctypes.WinDLL。
# 因為看ctypes源碼的話,會發(fā)現WinDLL也是一個類并且繼承自CDLL
# 所以在linux上使用ctypes.CDLL,
# 而在Windows上既可以使用WinDLL、也可以使用CDLL加載動態(tài)模塊
lib = ctypes.CDLL("./mmp.dll") # 加載之后就得到了擴展模塊
# 我們可以直接通過.的方式去調用里面的函數了,會發(fā)現成功打印
lib.test() # hello world

# 但是為了確定是否存在這個函數,我們一般會使用反射去獲取
# 因為如果函數不存在通過.的方式調用會拋異常的
func = getattr(lib, "test", None)
if func:
  print(func) # <_FuncPtr object at 0x0000029F75F315F0>
  func() # hello world


# 不存在test_xx這個函數,所以得到的結果為None
func1 = 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.加載動態(tài)模塊之后會返回一個對象,我們上面起名為lib,這個lib就是得到的擴展模塊了。

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

以上就是本次介紹的全部相關知識點,如果大家有任何補充的地方可以聯系腳本之家小編。

相關文章

  • Python+Pygame繪制小球的實例詳解

    Python+Pygame繪制小球的實例詳解

    這篇文章主要為大家詳細介紹了如何利用Python?Pygame繪制小球(漸變大的小球、自由下落的小球、循環(huán)上下反彈的小球),感興趣的小伙伴可以了解一下
    2022-10-10
  • Python面向對象之多態(tài)原理與用法案例分析

    Python面向對象之多態(tài)原理與用法案例分析

    這篇文章主要介紹了Python面向對象之多態(tài)原理與用法,結合具體案例形式分析了Python多態(tài)的具體功能、原理、使用方法與操作注意事項,需要的朋友可以參考下
    2019-12-12
  • 如何通過Python的pyttsx3庫將文字轉為音頻

    如何通過Python的pyttsx3庫將文字轉為音頻

    pyttsx3是一個開源的Python文本轉語音庫,可以將文本轉換為自然的人類語音,這篇文章主要介紹了如何通過Python的pyttsx3庫將文字轉為音頻,需要的朋友可以參考下
    2023-04-04
  • python圖像處理之反色實現方法

    python圖像處理之反色實現方法

    這篇文章主要介紹了python圖像處理之反色實現方法,涉及Python結合OpenCV與numpy操作圖片的相關技巧,需要的朋友可以參考下
    2015-05-05
  • python輸出100以內的質數與合數實例代碼

    python輸出100以內的質數與合數實例代碼

    本文通過實例代碼給大家介紹了python輸出100以內的質數與合數的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • Python pass函數實例用法

    Python pass函數實例用法

    在本篇文章里小編給大家整理了一篇關于Python pass函數實例用法,有興趣的朋友們可以學習下。
    2021-03-03
  • 使用 tf.nn.dynamic_rnn 展開時間維度方式

    使用 tf.nn.dynamic_rnn 展開時間維度方式

    今天小編就為大家分享一篇使用 tf.nn.dynamic_rnn 展開時間維度方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • pandas創(chuàng)建DataFrame對象失敗的解決方法

    pandas創(chuàng)建DataFrame對象失敗的解決方法

    本文主要介紹了pandas創(chuàng)建DataFrame對象失敗的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Python中if __name__ ==

    Python中if __name__ == "__main__"詳細解釋

    這篇文章主要介紹了Python中if __name__ == "__main__"詳細解釋,需要的朋友可以參考下
    2014-10-10
  • python3中的md5加密實例

    python3中的md5加密實例

    今天小編就為大家分享一篇python3中的md5加密實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評論