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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
Python3.6正式版新特性预览
Dec 15 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
情人节快乐! python绘制漂亮玫瑰
Aug 18 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
Python3如何判断三角形的类型
Apr 12 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
深入了解Python enumerate和zip
Jul 16 Python
详解Flask前后端分离项目案例
Jul 24 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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
php中字符串和正则表达式详解
2014/10/23 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
jquery实现数字输入框
2017/02/22 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
Python线性方程组求解运算示例
2018/01/17 Python
python删除服务器文件代码示例
2018/02/09 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
python中的逆序遍历实例
2019/12/25 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
专科应届生求职信
2013/11/24 职场文书
生产总经理岗位职责
2013/12/19 职场文书
大学生职业规划论文
2014/01/11 职场文书
教师自我鉴定范文
2014/03/20 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
关于长城的导游词
2015/01/30 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android