Python ctypes:揭秘高级Python与底层交互秘籍

news2025/1/20 15:48:14

更多资料获取

📚 个人网站:ipengtao.com


ctypes是Python标准库中的外部函数库,允许Python调用动态链接库中的函数。它提供了与C兼容的数据类型和允许Python调用共享库中的函数,对系统级编程和与硬件交互非常有用。

基本用法

加载动态链接库

cdllwindllctypes库中最常用的方法,分别用于加载C标准库和Windows DLL。

from ctypes import CDLL, c_int

# 加载C标准库
libc = CDLL("libc.so.6")  # 示例加载 C 库

# 加载Windows DLL
kernel32 = CDLL("kernel32.dll")

调用函数

# 在C标准库中调用printf函数
printf = libc.printf
printf(b"Hello, %s\n", b"World")

数据类型转换

ctypes提供了对C语言中的基本数据类型的对应,比如c_int, c_double, c_char_p等,用于处理C语言和Python数据类型之间的转换。

# 用c_int表示整数类型
my_int = c_int(42)

数据类型和内存操作

ctypes包含了C语言中常见的数据类型,如结构体、指针、数组等,同时也提供了访问内存的工具。

# 定义结构体
from ctypes import Structure, c_int

class Point(Structure):
    _fields_ = [("x", c_int), ("y", c_int)]

# 使用结构体
point = Point(10, 20)

高级用法

结构体和联合体

ctypes允许Python中定义和使用C语言中的结构体和联合体。

from ctypes import Union, c_int, c_double

# 定义联合体
class NumberUnion(Union):
    _fields_ = [("i", c_int), ("d", c_double)]

# 使用联合体
number = NumberUnion()
number.i = 42
print(number.d)  # 输出42.0

回调函数

ctypes允许Python创建回调函数并将其传递给C函数。

from ctypes import CFUNCTYPE, c_int

# 定义回调函数类型
callback_func = CFUNCTYPE(c_int, c_int, c_int)

# 在C函数中使用Python回调函数
def my_callback(a, b):
    return a + b

c_function_that_needs_callback = some_library.function_requiring_callback
c_function_that_needs_callback.argtypes = (callback_func,)
c_function_that_needs_callback.restype = c_int

动态修改函数签名

ctypes也允许在运行时更改函数签名或参数类型。

from ctypes import CFUNCTYPE, c_int

# 定义不同签名的函数类型
func_type1 = CFUNCTYPE(c_int, c_int)
func_type2 = CFUNCTYPE(c_int, c_int, c_int)

# 在运行时更改函数类型
function_pointer = cast(some_function_pointer, func_type2)

实际示例

与系统API交互

# 在Windows上调用MessageBox函数
from ctypes import WinDLL

user32 = WinDLL('user32')
user32.MessageBoxW(None, 'Hello, ctypes!', 'Message', 0)

调用外部库函数

# 调用libpng中的函数
from ctypes import cdll

libpng = cdll.LoadLibrary("libpng.so")
# 调用libpng函数...

性能和局限性

ctypes是一个功能强大的工具,但在性能和一些局限性方面存在一些考量。

性能

ctypes在调用外部函数时可能引入一定的性能开销。每次函数调用都需要Python解释器和C库之间的数据转换,这可能导致性能略微下降。相比于一些其他Python扩展库(比如Cython、CFFI等),ctypes的性能可能略逊一筹。

局限性

  • 对复杂C类型支持的限制:某些复杂的C数据类型,比如C++中的一些特殊结构、类等,ctypes的支持并不完善。由于Python与C之间的数据类型转换,涉及到更为复杂的结构时,可能需要更多的手动处理或者借助其他库来处理。

  • 跨平台兼容性问题ctypes对不同平台上外部库的加载可能会受限,需要考虑不同操作系统之间的差异。

  • 不够Pythonic:与Python的习惯和风格略有不同,可能需要开发者花费额外精力去适应。

替代方案

针对性能和某些局限性,有一些替代方案可以考虑:

  • Cython:可以编写Python代码,并以C语言的方式进行编译,提高执行效率。
  • CFFI:提供了更高级别的接口,并且在性能和跨平台支持上有所优势。
  • SWIG:允许开发者使用类似Python的语法来编写接口,以连接C和其他语言。

总结

Python的ctypes库为Python开发者提供了与C语言动态库交互的便捷途径。本文深入介绍了ctypes库的基本使用方法,包括加载动态库、调用函数、处理数据类型和内存操作。它还探讨了ctypes的高级功能,如结构体、回调函数和动态修改函数签名。通过实际示例,可以学习如何与系统API进行交互,以及调用已编写的C库中的函数。

还分享了ctypes的性能和局限性,提醒读者在使用时需要注意的一些事项。总之,ctypes是一个强大的工具,能够帮助Python开发者利用C语言的功能和库,尽管它可能存在一些性能方面的限制,但在许多情况下,它为Python与外部库和系统交互提供了便捷且灵活的途径。通过本文的学习,可以更好地了解如何利用ctypes在Python中进行C语言级别的交互,为其编程技能增添新的维度。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Django框架搭建的协同过滤算法电影推荐网站-爬取的豆瓣电影数据

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介概述技术栈实现流程 二、功能三、系统四. 总结 一项目简介 # 电影推荐网站介绍 概述 该电影推荐网站是基于Django框架搭建的,旨在为用户提供个…

jdk1.8 hashmap源码阅读

目录 hashmap 成员变量 hashmap支持null键吗?为什么? 当扩容的时候,所有元素都会重新计算hash值吗? 怎么减少扩容次数 为什么node数组的大小是2的n次? 1.8和1.7的区别 1.8为啥要用红黑树? 扩容机制…

12.3_黑马MybatisPlus笔记(上)

目录 02 03 04 05 06 07 ​编辑 thinking:system.out::println?​编辑 thinking:list.of? 08 thinking:RequestParam和 ApiParam注解使用? thinking:RequestParam 和PathVariable的区别? ​编辑 ​编…

“B2B+OMS方案”,赋能家电巨头构建BC订单一体化能力,促进业务增长|徐礼昭

某国际知名家电电器品牌,年营收超过5000亿元。该电器企业其整体业务分三大类:线上线下B2B2C业务、线下B2B业务以及DTC零售业务。 随着业务的发展,该电器品牌对2B业务及DTC业务的数字化系统能力支撑需要更加全面和立体,以适应业务…

Sharding-Jdbc(4):Sharding-Jdbc分库

1 新建数据库 创建ds_0数据库和ds_1数据库,在两个数据库新建表如下: CREATE TABLE t_order (order_id bigint(20) NOT NULL,user_id bigint(20) NOT NULL,PRIMARY KEY (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin; 2 新建maven项目…

基于姿态估计的3D动画生成

在本文中,我们将尝试通过跟踪 2D 视频中的动作来渲染人物的 3D 动画。 在 3D 图形中制作人物动画需要大量的运动跟踪器来跟踪人物的动作,并且还需要时间手动制作每个肢体的动画。 我们的目标是提供一种节省时间的方法来完成同样的任务。 我们对这个问题…

SmartSoftHelp8,FrameCode极速二次开发框架源码

1.winform outlook style UI C/S 极速开发框架 netframework 2.0 2.winform toolbar style UI C/S 极速开发框架 netframework 2.0 3.WPF toolbar style UI C/S 极速开发框架 netframework 4.0 4.Xadmin-UI jquery B/S 极速开发框架 5.Vue element UI B/S…

ArrayList 与 顺序表 (附洗牌算法)!

曾经我也是一枚学霸,直到有一天想去学渣的世界看看,结果就找不到回去的路了。 目录 1. 线性表 2.顺序表 2.1 接口的实现 3. ArrayList简介 4. ArrayList使用 4.1 ArrayList的构造 4.2 ArrayList常见操作 4.3 ArrayList的遍历 4.4 ArrayList的扩…

永倍达电商模式分析:创新商业模式引领新时代购物潮

在2019年底,全球新冠疫情席卷,导致大量实体经济倒闭,人们纷纷居家躲避,经济陷入下行,企业家面临倒闭威胁。永倍达成立于2020年,是陕西永倍达电子商务有限公司的品牌,而其母公司实际上是天津铸源…

Stable Diffusion 系列教程 - 1 基础准备(针对新手)

使用SD有两种方式: 本地: 显卡要求:硬件环境推荐NVIDIA的具有8G显存的独立显卡,这个显存勉勉强强能摸到门槛。再往下的4G可能面临各种炸显存、炼丹失败、无法生成图片等各种问题。对于8G显存,1.0模型就不行&#xff0…

前端入门(四)Ajax、Promise异步、Axios通信、vue-router路由、组件库

文章目录 AjaxAjax特点 Promise 异步编程(缺)Promise基本使用状态 - PromiseState结果 - PromiseResult AxiosVue中使用AxiosAxios请求方式getpostput和patchdelete并发请求 Vue路由 - vue-router单页面Web应用(single page web application&…

C++ string类(2)—成员访问、插入、删除、替换、查找和交换操作

目录 一、成员访问 1、[ ]&at 2、front( )&back( ) 二、插入元素 三、删除元素 四、替换元素 五、查找元素 1、查找第一次出现位置 2 、在指定范围内查找 六、交换字符串 七、c_str 八、rfind&substr 一、成员访问 1、[ ]&at 虽然二者功能一样&…

LeetCode | 101. 对称二叉树

LeetCode | 101. 对称二叉树 OJ链接 在本函数里不好进行判断,我们另外定义一个函数来如果两个都相等为空,就返回true一个为空,一个不为空都不为空,就比较值然后递归1的左,2的右,1的右,2的左 bool _isSymm…

javaee实验:MVC 框架技术应用——URL 映射及方法参数的使用

目录 urlmvc框架mvc框架的设计mvc流程 实验目的实验内容实验过程创建项目创建项目结构编写代码简单测试一下 url 和 Hypertext 以及 HTTP 一样,URL 是 Web 中的一个核心概念。它是浏览器用来检索 web 上公布的任何资源的机制 URL 代表着是统一资源定位符&#xff…

《洛谷深入浅出进阶篇》模意义下的乘法逆元+洛谷P3811

什么是乘法逆元? 算数意义上的乘法逆元指的是倒数,即:a*(1/a)1 所以 1/a 是 a在算数意义下的乘法逆元,或者可以说二者互为逆元。 这有什么用呢? 除以a就等于乘上a的乘法逆元,乘以…

keil5 --工程创建

一,文件夹介绍 首先去官网过去其他地方获取到官方提供的标准库文件 下面这个我是在官网进行下载的 我们在打开keil的时候会弹出一个在线下载的框(这个框这里先不做说明,后面在继续讲解),我们不使用这个在线下载功能&a…

LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

配置SAP用户密码策略(不用重启服务器的方法)

最近公司审计,给我们提出了要优化密码策略的建议,原因是我们的密码策略太简单了。我稍稍研究了一下。之前是通过RZ10来配置,但是这种方法需要重启服务器,这就比较麻烦。其实有一种方法是通过配置密码策略,不要要重启的…

包装材料ERP是什么?包装材料ERP有什么用

市面上的包装材料种类多种多样,而这些差异化的包装材料对应的产成品规格、型号、质量、销售策略和生产工艺等方面存在诸多差异。 另外,通常包装材料企业的营销渠道比较广泛,不同的销售平台有多样化的业务流程和管理方式,相同的商…

8-2比较三个字符串大小(指针)

#include<stdio.h> #include<string.h>int main(){char str1[20], str2[20], str3[59];//相当于 int a,b,c;printf("please input three str:\n");gets(str1);//sacnf("%s",str1);这里str1是数组名&#xff0c;表示数组空间的起始地址&#xf…