最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ā)現(xiàn)WinDLL也是一個類并且繼承自CDLL
# 所以在linux上使用ctypes.CDLL,
# 而在Windows上既可以使用WinDLL、也可以使用CDLL加載動態(tài)模塊
lib = ctypes.CDLL("./mmp.dll") # 加載之后就得到了擴展模塊
# 我們可以直接通過.的方式去調用里面的函數了,會發(fā)現(xiàn)成功打印
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í)行。

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

相關文章

  • Python入門教程之運算符重載詳解

    Python入門教程之運算符重載詳解

    運算符重載意味著賦予超出其預定義的操作含義的擴展含義。例如運算符 + 用于添加兩個整數以及連接兩個字符串和合并兩個列表。本文將通過示例帶大家詳細了解Python的運算符重載,感興趣的可以了解一下
    2022-09-09
  • Python中requests.session()的用法小結

    Python中requests.session()的用法小結

    這篇文章主要介紹了Python中requests.session()的用法小結,可能大家對?session?已經比較熟悉了,也大概了解了session的機制和原理,但是我們在做爬蟲時如何會運用到session呢,接下來要講到會話保持,需要的朋友可以參考下
    2022-11-11
  • pandas loc iloc ix用法詳細分析

    pandas loc iloc ix用法詳細分析

    pandas處理數據時,我們會經??吹絛ataframe結構使用loc, iloc, ix等方法,那么這些方法到底有啥區(qū)別,下面我們來進行詳細分析,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • Python 中的Schema數據結構及類型校驗詳解

    Python 中的Schema數據結構及類型校驗詳解

    schema?是一個簡單而強大的庫,用于定義和驗證 Python 數據結構的約束,使用?schema?庫來執(zhí)行數據結構的校驗,本文給大家介紹Python 中的Schema數據結構及類型校驗,感興趣的朋友一起看看吧
    2023-11-11
  • Python?flask框架post接口調用示例

    Python?flask框架post接口調用示例

    這篇文章主要介紹了Python?flask框架post接口調用,結合實例形式分析了基于flask框架的post、get請求響應及接口調用相關操作技巧,需要的朋友可以參考下
    2019-07-07
  • Python的網絡編程庫Gevent的安裝及使用技巧

    Python的網絡編程庫Gevent的安裝及使用技巧

    Gevent庫的奧義在于并發(fā)式的高性能網絡程序設計支持,這里我們將來講解Python的網絡編程庫Gevent的安裝及使用技巧,來看一下Gevent支持的多進程程序編寫:
    2016-06-06
  • wxpython繪制音頻效果

    wxpython繪制音頻效果

    這篇文章主要為大家詳細介紹了wxpython繪制音頻效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 淺談Python程序與C++程序的聯(lián)合使用

    淺談Python程序與C++程序的聯(lián)合使用

    這篇文章主要介紹了淺談Python程序與C++程序的聯(lián)合使用,主要包括6中方案,需要的朋友可以參考下
    2015-04-04
  • python中gradio的輸出展示組件實例代碼

    python中gradio的輸出展示組件實例代碼

    這篇文章主要介紹了python中gradio的輸出展示組件的相關資料,文章介紹了多種數據展示格式,包括HTML、JSON、KeyValues、Label、Markdown和Plot,每個格式都有其適用場景,需要的朋友可以參考下
    2024-11-11
  • Python利用PyPDF2庫合并多個pdf文件

    Python利用PyPDF2庫合并多個pdf文件

    PyPDF2庫是一個用于處理PDF文件的Python庫,它提供了一系列的工具來讀取、編輯、合并、拆分和加密PDF文件,使得我們可以在Python環(huán)境下輕松地對PDF文件進行操作,本文將帶大家介紹如何通過Python的PyPDF2庫合并多個pdf文件,需要的朋友可以參考下
    2023-05-05

最新評論

焦作市| 同德县| 桐乡市| 嵊州市| 昭觉县| 迭部县| 偃师市| 蓬安县| 三都| 石渠县| 南丹县| 砚山县| 射洪县| 堆龙德庆县| 永德县| 综艺| 井陉县| 姜堰市| 尚志市| 徐州市| 康平县| 资阳市| 江源县| 思茅市| 宁海县| 大城县| 霍州市| 固始县| 蚌埠市| 文山县| 垣曲县| 蚌埠市| 漠河县| 车险| 抚顺市| 濮阳县| 丹凤县| 资溪县| 万荣县| 台安县| 孟州市|