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分析git log日志示例
Feb 27 Python
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
python奇偶行分开存储实现代码
Mar 19 Python
Python加载带有注释的Json文件实例
May 23 Python
django主动抛出403异常的方法详解
Jan 04 Python
Python多项式回归的实现方法
Mar 11 Python
三步实现Django Paginator分页的方法
Jun 11 Python
python自定义时钟类、定时任务类
Feb 22 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
Python实现EM算法实例代码
Oct 04 Python
python opencv旋转图片的使用方法
Jun 04 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&amp;java(二)
2006/10/09 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
javaScript同意等待代码实现心得
2011/01/01 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
vue-cli如何引入bootstrap工具的方法
2017/10/19 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
Python实现端口复用实例代码
2014/07/03 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
用Python写一个自动木马程序
2019/09/17 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
使用Python发现隐藏的wifi
2020/03/04 Python
对python中return与yield的区别详解
2020/03/12 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
机关作风整顿个人剖析材料
2014/10/06 职场文书
夏洛特的网观后感
2015/06/15 职场文书
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫