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 Django连接MySQL数据库做增删改查
Nov 07 Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
Python编程flask使用页面模版的方法
Dec 28 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
Python实现多进程的四种方式
Feb 22 Python
解决.ui文件生成的.py文件运行不出现界面的方法
Jun 19 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
Python爬虫爬取微信朋友圈
Aug 06 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
PHP令牌 Token改进版
2008/07/18 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
javascript显示系统当前时间代码
2016/12/29 Javascript
拖动时防止选中
2017/02/03 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
python3 下载网络图片代码实例
2019/08/27 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
python re.match()用法相关示例
2021/01/27 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
委托证明的格式
2014/01/10 职场文书
求职毕业生自荐书
2014/02/08 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
毕业生自荐信格式
2014/03/07 职场文书
终止劳动合同协议书
2014/04/14 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
SQL语法CONSTRAINT约束操作详情
2022/01/18 MySQL
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis