python 使用ctypes调用C/C++ dll详情

 更新时间:2022年04月29日 10:32:38   作者:我来乔23  
这篇文章主要介绍了python 使用ctypes调用C/C++ dll详情,文章首先通过导入ctypes模块,加载C/C++ dll到python进程空间展开主题相关内容,需要的小伙伴可以参考一下

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)

基本数据类型以及结构体类型都可以正常通信。
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详情的文章就介绍到这了,更多相关python调用C++ dll内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中tqdm的使用和例子

    Python中tqdm的使用和例子

    Tqdm是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器tqdm(iterator),下面这篇文章主要给大家介绍了关于Python中tqdm的使用和例子的相关资料,需要的朋友可以参考下
    2022-09-09
  • Python温度转换实例分析

    Python温度转换实例分析

    这篇文章主要介绍了Python温度转换实例分析,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • PyTorch使用教程中的torch包详解

    PyTorch使用教程中的torch包详解

    文章介绍了PyTorch框架中torch包的基础组件,包括张量的创建和基本操作、张量的保存和加载、随机数生成以及张量的基础数学运算,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • python 求一个列表中所有元素的乘积实例

    python 求一个列表中所有元素的乘积实例

    今天小编就为大家分享一篇python 求一个列表中所有元素的乘积实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python文件路径读取实例代码详解

    Python文件路径读取实例代码详解

    这篇文章主要介绍了在Python中处理文件路径的方法,包括普通字符串、原始字符串、正斜杠的使用以及`os.path`模块的应用,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • Django框架的使用教程路由请求响应的方法

    Django框架的使用教程路由请求响应的方法

    这篇文章主要介绍了Django框架的使用教程路由请求响应的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • python OpenCV GrabCut使用实例解析

    python OpenCV GrabCut使用实例解析

    这篇文章主要介绍了python OpenCV GrabCut使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 最新整理Python中的type和object的示例详解

    最新整理Python中的type和object的示例详解

    这篇文章主要介绍了最新整理Python中的type和object的示例详解,最主要,是理解type和object的区别与联系,本文结合示例代码给大家讲解的非常详细,需要的朋友可以参考下
    2022-12-12
  • 如何运用sklearn做逻辑回归预测

    如何运用sklearn做逻辑回归预测

    这篇文章主要介绍了如何运用sklearn做逻辑回归预测问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Django接收post前端返回的json格式数据代码实现

    Django接收post前端返回的json格式数据代码实现

    这篇文章主要介绍了Django接收post前端返回的json格式数据代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论