python和C/C++混合编程之使用ctypes调用 C/C++的dll


Posted in Python onApril 29, 2022

python和C/C++混合编程,推荐使用python的内置模块ctypes,从名字上可以看出是c,可见对C++的支持并不太好。

一般的步骤:

  • 1、导入ctypes模块,加载C/C++ dll到python进程空间
  • 2、python类型转换为ctypes类型
  • 3、ctypes类型转换为C/C++类型

ctypes文档

VS2017 + Python3.8(IDE:py Charm)

python和C/C++混合编程之使用ctypes调用 C/C++的dll

基本数据类型以及结构体类型都可以正常通信。
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")

#调用
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)

如果结构体嵌套,也是可以成功传输的,但是在项目很大时可能会遇到大结构体通信数据错误,如char*传到C/C++端为无效的字符。
建议,将结构体按照先简单和复杂的顺序排列成员。
参考官方文档为python和C/C++中的结构体定义字节对齐。

如:

<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)
]

到此这篇关于python 使用ctypes调用C/C++ dll详情的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
python中管道用法入门实例
Jun 04 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
django中的HTML控件及参数传递方法
Mar 20 Python
Python unittest单元测试框架总结
Sep 08 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 Python
浅谈Python类的单继承相关知识
May 12 Python
Python深度学习之Pytorch初步使用
May 20 Python
python数据处理之Pandas类型转换
Python实现将多张图片合成MP4视频并加入背景音乐
Python FuzzyWuzzy实现模糊匹配
Apr 28 #Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 #Python
详解PyTorch模型保存与加载
Apr 28 #Python
Python 图片添加美颜效果
You might like
php实现websocket实时消息推送
2018/03/30 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
python实现类之间的方法互相调用
2018/04/29 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
智能旅行箱:Horizn Studios
2018/04/30 全球购物
艺术设计专业个人求职信
2013/09/21 职场文书
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
大学生找工作推荐信范文
2013/11/28 职场文书
教育局长自荐信范文
2013/12/22 职场文书
开办饭店创业计划书
2013/12/28 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
策划创业计划书
2014/02/06 职场文书
三峡大坝导游词
2015/01/31 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
行政答辩状范文
2015/05/21 职场文书
2015年校务公开工作总结
2015/05/26 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书