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实现WebSocket服务端过程解析

    python实现WebSocket服务端过程解析

    这篇文章主要介绍了python实现WebSocket服务端过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • MAC下Anaconda+Pyspark安装配置详细步骤

    MAC下Anaconda+Pyspark安装配置详细步骤

    一般MAC上使用的是zsh的shell工具,需要修改zshrc文件来使环境变量永久生效(若不修改该文件,在命令行中输入相应的命令即可,本文给大家介绍MAC下Anaconda+Pyspark安装配置详细步骤,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 浅谈PySpark SQL 相关知识介绍

    浅谈PySpark SQL 相关知识介绍

    这篇文章主要介绍了浅谈PySpark SQL 相关知识介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 2021年pycharm的最新安装教程及基本使用图文详解

    2021年pycharm的最新安装教程及基本使用图文详解

    这篇文章主要介绍了2021年pycharm的最新安装教程及基本使用,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • python淘宝抢购脚本程序实现

    python淘宝抢购脚本程序实现

    大家好,本篇文章主要讲的是python淘宝抢购脚本程序实现,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 聊聊Python中的pypy

    聊聊Python中的pypy

    这篇文章主要介绍了聊聊Python中的pypy,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python入门教程之运算符重载详解

    Python入门教程之运算符重载详解

    运算符重载意味着赋予超出其预定义的操作含义的扩展含义。例如运算符 + 用于添加两个整数以及连接两个字符串和合并两个列表。本文将通过示例带大家详细了解Python的运算符重载,感兴趣的可以了解一下
    2022-09-09
  • Python lxml模块的基本使用方法分析

    Python lxml模块的基本使用方法分析

    这篇文章主要介绍了Python lxml模块的基本使用方法,结合实例形式分析了Python安装与使用lxml模块常见操作技巧与相关注意事项,需要的朋友可以参考下
    2019-12-12
  • Python中可变变量与不可变变量详解

    Python中可变变量与不可变变量详解

    这篇文章主要介绍了Python中可变变量与不可变变量,但Python中没有指针和引用的概念,导致很多时候参数的传递和调用的时候会产生疑问:我到底是复制了一份新的做操作还是在它指向的内存操作?下面我们就带着疑问去阅读下面文章内容吧
    2021-10-10
  • python变量的存储原理详解

    python变量的存储原理详解

    这篇文章主要介绍了python变量的存储原理详解,对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身,需要的朋友可以参考下
    2019-07-07

最新评论