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 break语句详解
Mar 11 Python
Python字符串转换成浮点数函数分享
Jul 24 Python
浅谈Python 字符串格式化输出(format/printf)
Jul 21 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
python使用zip将list转为json的方法
Dec 31 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
python topk()函数求最大和最小值实例
Apr 02 Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
python实现批量移动文件
Apr 05 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 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 柱状图实现代码
2009/12/04 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
提升python处理速度原理及方法实例
2019/12/25 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
Java如何调用外部Exe程序
2015/07/04 面试题
《九色鹿》教学反思
2014/02/27 职场文书
安全责任书怎么写
2014/07/28 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
公司员工手册范本
2015/05/14 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
如何利用python创作字符画
2022/06/25 Python