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中的Cookie模块使用
Jul 06 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
python实现感知器算法(批处理)
Jan 18 Python
如何通过Python实现标签云算法
Jul 02 Python
Python tcp传输代码实例解析
Mar 18 Python
给ubuntu18安装python3.7的详细教程
Jun 08 Python
Python实现七个基本算法的实例代码
Oct 08 Python
解决python3中os.popen()出错的问题
Nov 19 Python
python 实现mysql自动增删分区的方法
Apr 01 Python
Python基础之操作MySQL数据库
May 06 Python
基于flask实现五子棋小游戏
May 25 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
php use和include区别总结
2019/10/13 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
js 判断 enter 事件
2009/02/12 Javascript
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python 序列的方法总结
2016/10/18 Python
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
BRASTY捷克:购买香水、化妆品、手袋和手表
2017/07/12 全球购物
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
高三自我鉴定范文
2013/10/19 职场文书
中学生团员自我评价分享
2013/12/07 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
感恩节寄语2015
2015/03/24 职场文书
一条慢SQL语句引发的改造之路
2022/03/16 MySQL