最近在做用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...