PYTHON直接呼叫DLL實現和C 的互動

2021-08-19 04:47:49 字數 1570 閱讀 3456

最近在做用python呼叫c++程式,因為c++程式是現成的,而且效率高。聽著感覺不難,直接呼叫dll應該就成,等我著手做的時候,真是處處碰壁。

1、自己寫乙個介面程式,實現c++到python的對映,從而實現python的擴充套件。

2、利用工具包swig,這個方法真是簡單,深得我心,在這個方法上耗時半天,最終棄之。

3、對c++程式生成dll檔案,python利用自身帶的包ctypes實現資料的傳遞,最終成功。

前兩種方法我嘗試後均以失敗告終,因為c++與python互動時,我需要傳遞指標,以上兩種方法我沒搞懂怎麼傳遞資料。還有一些別的方法像利用boost、numpy等,實在是等不及了,剛開個頭就放棄了。現在就說說親測有效的方法,直接上**:

my.cpp

#define export_my_dll 

#include "my.h"

#include #include #include using namespace std;

my_api void add(int *l, int *r)

}

my.h

#ifdef export_my_dll 

#define my_api __declspec(dllexport)

#else

#define my_api __declspec(dllimport)

#endif

extern "c"

我想用python呼叫add函式,我在程式裡面寫好介面就可以建立。詳細見

接下來寫python程式:

import numpy as np

import ctypes

from ctypes import *

a = np.ones(2).astype(np.int)

b = np.ones(2).astype(np.int)

a_ctypes_ptr = cast(a.ctypes.data, pointer(c_int)) #轉換為ctypes,這裡轉換後的可以直接利用ctypes轉換為c語言中的int*,然後在c中使用

b_ctypes_ptr = cast(b.ctypes.data, pointer(c_int)) #轉換為ctypes,這裡轉換後的可以直接利用ctypes轉換為c語言中的int*,然後在c中使用

dll = cdll.loadlibrary('mys.dll')

dll.add(a_ctypes_ptr,b_ctypes_ptr)

for i in range(2):

print(a_ctypes_ptr[i])

是的,就是這樣!可以直接利用ctypes將python資料轉換成c中的指標,然後傳遞給c,在c中使用,並且這種方法不需要再將指標傳回來,直接在程式中對陣列進行了修改,想要觀察矩陣元素,直接對轉換後的資料進行操作就成了!

真是激動人心!

swig的學習:

ctypes的學習:

python呼叫dll方法

在python中呼叫dll檔案中的介面比較簡單,例項 如下 如我們有乙個test.dll檔案,內部定義如下 extern c 在python中我們可以用以下兩種方式載入1.import ctypes dll ctypes.windll.loadlibrary test.dll 2.import ct...

python呼叫dll方法

在python中呼叫dll檔案中的介面比較簡單,例項 如下 如我們有乙個test.dll檔案,內部定義如下 extern c 在python中我們可以用以下兩種方式載入1.import ctypes dll ctypes.windll.loadlibrary test.dll 2.import ct...

python呼叫dll詳解

參考鏈結 windows安裝mingw w64教程 公司業務需要,讓我用python呼叫領導寫好的dll庫,經過一段時間的研究,終於呼叫成功,特此來記錄一下過程 開發環境win10 python3.6.8 64位 安裝這個的目的是生成dll檔案用,參考位址在上面,講一下注意的點。安裝的時候versi...