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读写文件操作示例程序
Dec 02 Python
python使用wmi模块获取windows下的系统信息 监控系统
Oct 27 Python
sublime text 3配置使用python操作方法
Jun 11 Python
Django实现快速分页的方法实例
Oct 22 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
Django REST framework 分页的实现代码
Jun 19 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 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
德劲1107的电路分析与打磨
2021/03/02 无线电
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
2007/03/08 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
mysql 之通过配置文件链接数据库
2017/08/12 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Python实现代码统计工具
2019/09/19 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
优秀部门获奖感言
2014/02/14 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
教师考核表个人总结
2015/02/12 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
python本地文件服务器实例教程
2021/05/02 Python