python使用ctypes呼叫擴充套件模組的例項方法

2021-10-17 03:59:46 字數 1694 閱讀 3894

楔子

我們知道python的執行效率不是很高,而且由於gil的原因,導致python不能充分利用多核cpu。一般的解決方式是使用多程序,但是多程序開銷比較大,而且程序之間的通訊也會比較麻煩。因此在解決效率問題上,我們會把那些比較耗時的模組使用c或者c++編寫,然後編譯成動態鏈結庫,windows上面是dll,linux上面則是so,編譯好之後,交給python去呼叫。而且通過擴充套件模組的方式還可以解決python的gil的問題,因此如果想要利用多核,我們仍然可以通過擴充套件模組的方式。

python如何呼叫擴充套件模組

python呼叫擴充套件模組的一種比較簡單的方式就是使用ctypes這個庫,這個庫是python官方提供的,任何乙個版本的python都可以使用,我們通過ctypes可以很輕鬆地呼叫擴充套件模組。

演示#include

void test()

我們定義了乙個很簡單的函式,下面我們就可以將其編譯成擴充套件模組了。在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

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

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.載入動態模組之後會返回乙個物件,我們上面起名為lib,這個lib就是得到的擴充套件模組了。

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

python中ctypes的使用

window下,python銜接c語言程式設計 本地安裝64位的python3.5,visual studio 2017 step1 安裝visual studio 2017,提供c語言編譯器 即msvc版本,另一版本是linux下的gcc step2 選擇x64的命令列 step3 輸入pip i...

python使用ctypes呼叫 c

不多bb,非常簡單。簡單來說,c c完整的 段只需要編譯輸出到dll程度,就可以被python呼叫了。python呼叫dll的方法,就是用ctypes裡面的方法。1 先把完整 段寫成.c cpp,放好備用。2 然後用msvc編譯這個,輸出dll。找不到msvc?如果你安裝了visual studio...

python效率提公升 ctypes的使用

python執行效率緩慢,一直是為眾人所詬病的。不過還好,python的ctypes庫可以呼叫載入c c 的函式庫,這樣python中需要效率的部分就用c c 寫,從而極大地提公升python的執行效率。1.不用ctypes的示例 from time import time t time s 0fo...