ctypes 封装c语言

一,python与C类型对应关系

最左边一列的ctypes type,以替代C库中的各种类型。

二,不带参数的调用

1,target.c

#include <stdio.h>void hello_world(){printf("hello downey!!\r\n");
}

2,执行命令编译动态连接库文件

gcc -shared -o libtarget.dll target.c

        linux:
        gcc --shared -fPIC -o target.c libtarget.so
        windows:
        gcc -shared -o libtarget.dll target.c

3,test.py

import ctypesif __name__ == '__main__':test = ctypes.windll.LoadLibrary("./libtarget.dll")test.hello_world()

4,输出

hello downey!!

三,带参数的调用

1,target.c

#include <stdio.h>char add(int a, int b){return a + b;
}char mul(int a, int b){return a * b;
} 

2,执行编译命令

    gcc -shared -o libtarget.dll target.c

3,test.py

from ctypes import *if __name__ == '__main__':# windll.LoadLibrary("./libtarget.dll")  # woinows应该用windll ,但用cdll在windows下测测试也没问题。test = cdll.LoadLibrary("./libtarget.dll") # linux 用cdlltest.add.restype = c_inttest.mul.restype = c_intc = test.add(48,22)print(type(c))print(c)d = test.mul(48, 22)print(d)

4,输出

<class 'int'>
70
1056

四,结构体数据格式

1,target.c

#include <stdio.h>
#include <string.h>typedef struct{char *ptr;float f;char array[10];
}target_struct;target_struct* hello_world(target_struct* target){static char temp = 0x30;target->ptr = &temp;target->f = 3.1;memset(target->array,1,sizeof(target->array));return target;
}

2,执行编译命令

    gcc -shared -o libtarget.dll target.c

3,test.py

from ctypes import *# 声明一个和结构体数据对应的数据结构类 
# _fields_是字典类型,key要与C库中结构体相对应,value则是指定相应类型
class test_struct(Structure):_fields_ = [('ptr', c_char_p),('c', c_float),('array', c_char * 10)]if __name__ == '__main__':test = windll.LoadLibrary("./libtarget.dll")# 构造一个对应C中结构体的类,可以传入对应参数进行构造。struct = test_struct(c=0.5)#指定返回值类型为test_struct指针类型,这里的类型由POINTER()修饰,表示是指针类型test.hello_world.restype = POINTER(test_struct)# 调用hello_world()函数,传入struct类,pointer(struct)就是将struct转为指针类型实例。因为在C中的接口就是传入target_struct类型,返回target_struct类型,所以ret_struct也是target_struct*类型ret_struct = test.hello_world(pointer(struct))# 打印函数返回值,查看执行结果。对于一个指针类型的变量,如果我们要获取它的值,可以使用.contents方法print(ret_struct.contents.ptr)print(ret_struct.contents.c)

4,输出

b'0'
3.0999999046325684
 

五,参数传入函数引用,c调用python函数

1,target.c

#include <stdio.h>
#include <string.h>typedef void (*callback)(int);void func(callback c1,callback c2,int p1,int p2){c1(p1);c2(p2);
}

2,执行编译命令

 gcc -shared -o libtarget.dll target.c

3,test.py

from ctypes import *def test_callback1(val):print("I'm callback1")print(val)def test_callback2(val):print("I'm callback2")print(val)if __name__ == '__main__':test = windll.LoadLibrary("./libtarget.dll")CMPFUNC = CFUNCTYPE(None, c_int)cbk1 = CMPFUNC(test_callback1)cbk2 = CMPFUNC(test_callback2)test.func(cbk1, cbk2, 1, 2)

4,输出

I'm callback1
1
I'm callback2
2

windos 安装gcc:

Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly_mingw the file has been downloaded incorrectly-CSDN博客

参考:

python代码用c语言封装_python调用C语言接口-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/297531.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库 06-02 并发控制

01 02. 互斥访问数据 分成两种&#xff1a; 事务控制器的作用

【系统架构师】-软件产品线与构件

1、产品线 核心资源、产品集合 1、过程驱动 2、特定领域 3、技术支持 4、以架构为中心 双生命周期模型&#xff1a; 建立产品线的方式&#xff1a;演化、革命 成功因素&#xff1a; 对该领域具备长期和深厚的经验 一个用于构建产品的好的核心资源库 好的产品线架构 好的管…

Spring Boot 整合 RabbitMQ 实现延迟消息

关于 RabbitMQ 消息队列&#xff08;Message Queuing&#xff0c;简写为 MQ&#xff09;最初是为了解决金融行业的特定业务需求而产生的。慢慢的&#xff0c;MQ 被应用到了更多的领域&#xff0c;然而商业 MQ 高昂的价格让很多初创公司望而却步&#xff0c;于是 AMQP&#xff0…

【Java基础】Java基础知识整合

文章目录 1. 转义字符2. 变量2.1 字符串与整型相加2.2 byte和short的区别2.3 float和double的区别2.4 char类型2.5 boolean类型2.6 自动类型转换及运算2.7 强制类型转换2.8 String的转换2.9 除法运算2.10 取模规则 3. 自增4. 逻辑运算符5. 赋值运算 6. 三元运算符&#xff1a;7…

05 | Swoole 源码分析之 WebSocket 模块

首发原文链接&#xff1a;Swoole 源码分析之 WebSocket 模块 大家好&#xff0c;我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同&#xff0c;WebSocket 可以保持…

每日五道java面试题之ZooKeeper篇(一)

目录&#xff1a; 第一题. ZooKeeper 是什么&#xff1f;第二题. Zookeeper 文件系统第三题. Zookeeper 怎么保证主从节点的状态同步&#xff1f;第四题. 四种类型的数据节点 Znode第五题 . Zookeeper Watcher 机制 – 数据变更通知 第一题. ZooKeeper 是什么&#xff1f; Zoo…

Python爬虫:http和https介绍及请求

HTTP和HTTPS 学习目标&#xff1a; 记忆 http、https的概念和区别记忆 浏览器发送http请求的过程记忆 http请求头的形式记忆 http响应头的形式了解 http响应状态码 1 为什么要复习http和https 在发送请求&#xff0c;获取响应的过程中 就是发送http或https的请求&#xff0c…

工业组态 物联网组态 组态编辑器 web组态 组态插件 编辑器

体验地址&#xff1a;by组态[web组态插件] BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架的限制。同时由于BY组态只是一个插件&#xff0c;不能独…

探索大数据时代下与云计算技术融合:实现企业级数据处理与分析的灵活性和效率性

引言&#xff1a; 关联阅读博客文章&#xff1a;深度剖析&#xff1a;计算机集群在大数据体系中的关键角色和技术要点 随着信息时代的到来&#xff0c;数据量的爆炸性增长已成为一种常态。企业、政府、科研机构等各个领域都面临着海量数据的收集、存储、处理和分析的挑战。在…

Linux云计算之Linux基础2——Linux发行版本的安装

目录 一、彻底删除VMware 二、VMware-17虚拟机安装 三、MobaXterm 安装 四、Centos 发行版 7.9的安装 五、rockys 9.1的安装 六、ubuntu2204的安装 一、彻底删除VMware 在卸载VMware虚拟机之前&#xff0c;要先把与VMware相关的服务和进程终止 1. 在windows中按下【Windo…

Spring Security——05,退出登录

退出登录 一、实现二、测试2.1、退出了是否还可以访问接口 一键三连有没有捏~~ 一、实现 我们只需要定义一个登陆接口&#xff0c;然后获取SecurityContextHolder中的认证信息&#xff0c;删除redis中对应的数据即可。 1、LoginController 添加一个方法 logout() 退出登录 2、…

51单片机实验01-点亮LED小灯

目录 一&#xff0c;软件下载 二&#xff0c;单片机概述 1&#xff0c;单片机内部资源 1&#xff09;flash 2&#xff09;ram 3&#xff09;sfr 2&#xff0c;51单片机 3&#xff0c;单片机最小系统 三&#xff0c;点亮最右边的小灯 1&#xff0c;指出满足小灯点亮的有…

基于Java微信小程序的医院挂号小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

ajax教程

文章目录 一、原生ajax1、AJAX 简介2、特点1&#xff09;优点2&#xff09;缺点 二、http协议1、概念2、Cookie和Session机制1&#xff09;Cookie2&#xff09;Session3&#xff09;报文 二、请求头1、概念2、常见请求头&#xff1a;3、Content-Type 三、AJAX使用1、详细操作2、…

【RealSense】Ubuntu20.04 安装 Intel® RealSense™ ROS 并使用 D435i 测试

【RealSense】Ubuntu20.04 安装 Intel RealSense™ ROS 并使用 D435i 测试 1 本机环境2 安装流程3 存在的 bug3.1 Resource not found: rgbd_launch 1 本机环境 Ubuntu20.04ROS Noetic 2 安装流程 参考文档: Link 安装 Intel RealSense™ SDK 2.0&#xff0c;参考上一篇文章:…

【办公类-47-01】20240404 Word内部照片批量缩小长宽(课题资料系列)

作品展示 背景需求 最近在做《运用Python优化3-6岁幼儿学习操作材料的实践研究》的课题研究资料&#xff08;上半学期和下半学期&#xff09;。 将CSDN里面相关的研究照片文字贴入Word后&#xff0c;就发现一张图片就占了A4竖版一页&#xff0c;太大了。我想把word里面的所有…

入门用Hive构建数据仓库

在当今数据爆炸的时代&#xff0c;构建高效的数据仓库是企业实现数据驱动决策的关键。Apache Hive 是一个基于 Hadoop 的数据仓库工具&#xff0c;可以轻松地进行数据存储、查询和分析。本文将介绍什么是 Hive、为什么选择 Hive 构建数据仓库、如何搭建 Hive 环境以及如何在 Hi…

unity学习(82)——profiler 限制帧率

实际测试发现当玩家个数增加时&#xff0c;客户端明显变的很卡&#xff0c;想知道为什么变卡了&#xff01; 1.只有玩家自己的时候 2.两个时候感觉脚本的工作量增大了 拖了一会直接炸了&#xff01;&#xff08;数据包积压把内存搞炸&#xff0c;我第一次见&#xff09; 3.我觉…

哈佛大学商业评论 --- 第三篇:真实世界中的增强现实

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 本文作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大…

数据结构课堂考勤管理系统

摘要 高校的不断扩张让在校学生数量不断的增加&#xff0c;对于教师和管理人员的需求也在不断地增强&#xff0c;对日常的学生考勤管理的工作量也在日益增加&#xff0c;传统的人工点名签到的考勤管理模式已经给无法适用于当前高校考勤管理的需求&#xff0c;同时手动录入的考…