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写的服务监控程序实例
Jan 31 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
Random 在 Python 中的使用方法
Aug 09 Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
python3的url编码和解码,自定义gbk、utf-8的例子
Aug 22 Python
Django stark组件使用及原理详解
Aug 22 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
详解python uiautomator2 watcher的使用方法
Sep 09 Python
python全栈开发语法总结
Nov 22 Python
Python离线安装各种库及pip的方法
Nov 28 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
AngularJs每天学习之总体介绍
2017/08/07 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
Python实现获取某天是某个月中的第几周
2015/02/11 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
python利用7z批量解压rar的实现
2019/08/07 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
python实现粒子群算法
2020/10/15 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
师范应届生教师求职信
2013/11/05 职场文书
自荐信范文
2013/12/10 职场文书
2014的自我评价
2014/01/13 职场文书
大学生创业感言
2014/01/25 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
华山导游词
2015/02/03 职场文书
校长新学期致辞
2015/07/30 职场文书
教务处干事工作总结
2015/08/14 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
八年级作文之友谊
2019/12/02 职场文书