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使用PyGreSQL操作PostgreSQL数据库教程
Jul 30 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
带你认识Django
Jan 15 Python
python爬虫 2019中国好声音评论爬取过程解析
Aug 26 Python
Python调用Windows命令打印文件
Feb 07 Python
关于多元线性回归分析——Python&amp;SPSS
Feb 24 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
Python实现自动装机功能案例分析
Oct 22 Python
Python异常类型以及处理方法汇总
Jun 05 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/06/16 PHP
php session 写入数据库
2016/02/13 PHP
php实现socket推送技术的示例
2017/12/20 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
python实现的解析crontab配置文件代码
2014/06/30 Python
python config文件的读写操作示例
2019/09/27 Python
Python sep参数使用方法详解
2020/02/12 Python
Python网页解析器使用实例详解
2020/05/30 Python
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
医药营销专业个人自荐信
2013/09/29 职场文书
咨询公司各岗位职责
2013/12/02 职场文书
党员思想汇报材料
2014/12/19 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS