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 相关文章推荐
wxPython窗口的继承机制实例分析
Sep 28 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Python3安装Pymongo详细步骤
May 26 Python
python删除文本中行数标签的方法
May 31 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
Python Matplotlib库安装与基本作图示例
Jan 09 Python
python破解bilibili滑动验证码登录功能
Sep 11 Python
python tkinter canvas使用实例
Nov 04 Python
Python:slice与indices的用法
Nov 25 Python
python连接mongodb集群方法详解
Feb 13 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
PDO::prepare讲解
2019/01/29 PHP
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
在类Unix系统上开始Python3编程入门
2015/08/20 Python
python交互式图形编程实例(三)
2017/11/17 Python
将python代码和注释分离的方法
2018/04/21 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
如何使用Python 打印各种三角形
2019/06/28 Python
flask应用部署到服务器的方法
2019/07/12 Python
python清空命令行方式
2020/01/13 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
法律专业推荐信范文
2013/11/29 职场文书
大学校园活动策划书
2014/02/04 职场文书
公司授权委托书范文
2014/08/02 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
汉语拼音教学反思
2016/02/22 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS