python呼叫C DLL 傳參技巧

2022-05-02 04:06:06 字數 2521 閱讀 1131

結構體傳參:

準備工作:

c++檔案(cpp):(注意在函式宣告上加上extern "c" 的修飾)

#include extern"c

" int double(int

x)float floatadd(float a,float

b) void helloworld(char *str)

void ints(int * arr,int

n) puts(

"");

}

用g++(mingw64位)編譯為dll:

g++ dlltest.cpp -shared -o dlltest.dll -wl,--out-implib,dlltest.lib

pause

在python指令碼中載入dll :

from ctypes import *dll = cdll.loadlibrary('

dll/dlltest.dll

')

1.如果不加任何修飾,預設傳入引數為int,傳出引數也為int

2.對於int以外的型別(如float),需要宣告python函式的傳入引數型別傳出引數型別

fun.argtypes=[c_float,c_float]  #

定義傳參型別

fun.restype=c_float #

定義返回值型別

a=fun(c_float(1.4),c_float(1.2))

print

(type(a))

print(a)

輸出:

'float

'>

2.5999999046325684

3.對於字串char*,在宣告傳入引數型別時,需要宣告為字元指標,然後分配一塊char陣列,最後把這個陣列強制轉換為字元指標並且,在把python指令碼中的資料結構匯入c++中時,需要把str轉換為bytes或者bytesarray型別,並且進行迭代器分解

hello=dll.helloworld

hello.argtypes=[pointer(c_char)] #

傳入引數為字元指標

str=(c_char * 100)(*bytes("

相信你還在這裡

",'utf-8

')) #

把一組100個的字元定義為str

cast(str, pointer(c_char))

hello(str)

輸出:

相信你還在這裡
4.對於其他資料型別的陣列,(例如int*),操作相似:

ints=dll.ints

ints.argtypes=[pointer(c_int),c_int]

int=(c_int * 100)(*[1,2,3]) #

把列表傳入變長引數args*中

cast(int, pointer(c_int))

ints(int,c_int(3))

輸出:

1 2 3

def

fillholecpp(im):

dll = cdll.loadlibrary("

bfs.dll")

bfs=dll.bfs

bfs.argtypes =[pointer(c_int),c_int]

bfs.restype =pointer(c_int)

a = np.asarray(range(16), dtype=np.int32).reshape([4, 4])

ifnot a.flags['

c_contiguous']:

a = np.ascontiguous(a, dtype=a.dtype) #

如果不是c連續的記憶體,必須強制轉換

img = cast(a.ctypes.data, pointer(c_int)) #

轉換為ctypes,這裡轉換後的可以直接利用cty

cast(img, pointer(c_int))

length=a.size

ans=bfs(img,c_int(length))

print

(type(ans))

for i in

range(0,length):

print(ans[i],end='

')

python 函式,傳參,呼叫

簡單函式介紹 定義 形參 實參 傳參的4中方式 呼叫 return 1.函式定義 python中函式必須先定義,再使用.寫乙個函式前要空兩行,寫完後再空兩行.pycharm書寫 def 函式名 引數 1 2 2.函式呼叫 函式名 引數 舉例 使用函式完成 1 2 定義函式 def add resul...

C 呼叫C dll時,結構體引用傳參的方法

寫了乙個c 的loglog logit 四引數等演算法的介面dll,給c 呼叫,但是發現傳參有問題 如extern c declspec dllexport bool testfunc enummethod emethod,unsigned int uipoints,const double par...

php傳參呼叫python指令碼

由於我的 專案的後端採用的是php 但是在爬蟲方面的時候 python是最簡單的選擇 因此需要php與python進行互動 需求是要帶引數的 例如自動登入某個 而使用者密碼是不同的 查閱資料得知 php有這個函式exec 這個函式的作用可以執行第三方程式 約等於在shell命令列中輸入指令 約等於c...