python?使用ctypes調(diào)用C/C++?dll詳情
python和C/C++混合編程,推薦使用python的內(nèi)置模塊ctypes,從名字上可以看出是c,可見對(duì)C++的支持并不太好。
一般的步驟:
- 1、導(dǎo)入ctypes模塊,加載C/C++ dll到python進(jìn)程空間
- 2、python類型轉(zhuǎn)換為ctypes類型
- 3、ctypes類型轉(zhuǎn)換為C/C++類型
VS2017 + Python3.8(IDE:py Charm)

基本數(shù)據(jù)類型以及結(jié)構(gòu)體類型都可以正常通信。
DLL:
extern "C"{
struct MyStruct{
int num_int;
long num_long;
float num_float;
double num_double;
char* num_str;
};
int __declspec(dllexport) print(MyStruct my)
printf("%d\n", my.num_int);
printf("%d\n", my.num_long);
printf("%f\n", my.num_float);
printf("%f\n", my.num_double);
printf("%s\n", my.num_str);
}PYTHON:
import ctypes
class MyStruct(Structure):
_fields_ = [
("num_int", c_int),
("num_long", c_long),
("num_float", c_float),
("num_double", c_double),
("num_str", c_char_p)
]
# dll全路徑,依賴完整
dll = ctypes.WinDLL("C:\\work\\mytest.dll")
#調(diào)用
my = MyStruct();
my.num_int = 23
my.num_long = 1024
my.num_float = 3.14
my.num_double = 3.141592653
my.num_str = b"hello world"
dll.print(my)如果結(jié)構(gòu)體嵌套,也是可以成功傳輸?shù)?,但是在?xiàng)目很大時(shí)可能會(huì)遇到大結(jié)構(gòu)體通信數(shù)據(jù)錯(cuò)誤,如char*傳到C/C++端為無(wú)效的字符。
建議,將結(jié)構(gòu)體按照先簡(jiǎn)單和復(fù)雜的順序排列成員。
參考官方文檔為python和C/C++中的結(jié)構(gòu)體定義字節(jié)對(duì)齊。
如:
<strong>#pragma pack(4)</strong>
struct MyStruct{
int num_int;
long num_long;
float num_float;
double num_double;
char* num_str;
};class MyStruct(Structure):
<strong>_pack_ </strong><strong>= 4</strong>
_fields_ = [
("num_int", c_int),
("num_long", c_long),
("num_float", c_float),
("num_double", c_double),
("num_str", c_char_p)
]到此這篇關(guān)于python 使用ctypes調(diào)用C/C++ dll詳情的文章就介紹到這了,更多相關(guān)python調(diào)用C++ dll內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 求一個(gè)列表中所有元素的乘積實(shí)例
今天小編就為大家分享一篇python 求一個(gè)列表中所有元素的乘積實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Django框架的使用教程路由請(qǐng)求響應(yīng)的方法
這篇文章主要介紹了Django框架的使用教程路由請(qǐng)求響應(yīng)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python OpenCV GrabCut使用實(shí)例解析
這篇文章主要介紹了python OpenCV GrabCut使用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
如何運(yùn)用sklearn做邏輯回歸預(yù)測(cè)
這篇文章主要介紹了如何運(yùn)用sklearn做邏輯回歸預(yù)測(cè)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Django接收post前端返回的json格式數(shù)據(jù)代碼實(shí)現(xiàn)
這篇文章主要介紹了Django接收post前端返回的json格式數(shù)據(jù)代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

