ctypes库踩坑日记1

  • 1.引言(这里是讲的windows下调用的方式)
  • 2.结构体
  • 3.联合体(共用体)
    • 和上面结构体用法类似,只不过这里继承的是`Union`类
  • 4.进阶用法
  • 5.接受返回的值
  • 6.数据类型

1.引言(这里是讲的windows下调用的方式)

直接上代码
代码片.

# An highlighted block
from ctypes import *
class MyDll(object):def __init__(self,DLL_path):self.__dll=WinDLL(DLL_PATH)self.handle=Nonedef handle(self):"""一般开始都要先获取句柄"""res=self.__dll.获取句柄的函数self.handle=res

#注:这里如果获取的返回的内容和文档预期的不太一样,就要设置返回值
类型(默认返回值类型是int类型),本人用的c_byte类型才得到想要的内容

def fanc_type(fanc):fanc.restype=c_byte

2.结构体

1.非常简单的一个结构体

from ctypes import *
class POINT(Structure):_fields_ = [("x", c_int),("y", c_int)]point = POINT(10, 20)
print(point.x, point.y)

2.带数据长度的结构体

from ctypes import *
class POINT(Structure):_fields_ = [("x", c_int*10),("y", c_int*5)]

3.结构体嵌套结构体

from ctypes import *
class POINT_B(Structure):_fields_ = [("y", c_int),]
class POINT(Structure):_fields_ = [("x", POINT_B*10),]

3.联合体(共用体)

from ctypes import *
class POINT(Union):_fields_ = [("x", c_int*10),]
和上面结构体用法类似,只不过这里继承的是Union

4.进阶用法

回调函数暂时没有用到
有的时候结构体中需要做判断

from ctypes import *
class POINT(Structure):if a>5:_fields_ = [("x", c_int*10),("y", c_int*5)]elif a=5:_fields_=[("x", c_int*15),("y", c_int*5)]else:_fields_=[("x", c_int*15),]

5.接受返回的值

通常获取到值,如果有很多取值非常麻烦
例如:

res=...........
print(res.content1)
print(res.content2)

这样取值很麻烦
所以写了个函数来专门取里面的内容,有待改进,目前已经可以应对
大部分的结构体

from ctypes import *
def dump_dict(structure):"""结构体转字典传入一个结构体返回一个字典实现原理:# 通过_fields_获取每一个字段# 检查每个字段的类型,根据不同类型分别处理# 支持递归迭代"""if 'contents' in dir(structure):structure = structure.contentsif 'value' in dir(structure):return structure.valueinfo = {}if '_fields_' in dir(structure):for k, v in structure._fields_:av = getattr(structure, k)if type(v) == type(Structure):av = dump_dict(av)elif type(v)==type(Union):av = dump_dict(av)elif type(v) == type(Array):try:av = cast(av, c_char_p).value.decode()except:av='Array_Dict_Error' else:passinfo[k] = avreturn info

6.数据类型

官方基本都有:
只有这几种用的时候用的见名不知意,语义化不是很好

ctypes类型 C类型 Python 数据类型
c_char char 单字符字节串对象
c_byte char int
c_ubyte unsigned char int

待续…

python内置库之学习ctypes库(一)相关推荐

  1. python内置库之学习ctypes库(二)

    ctypes库踩坑日记2 一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰 二.生成dll文件 三.ctypes库调用 一.自己实现一个dll文件,再用python的cty ...

  2. python内置库之学习ctypes库(三)--调用Win32API

    ctypes库踩坑日记3 1.调用win32的api 2.最好让结构体和程序分开 3.取完数据找到对应信息,创建code.py 4.创建main.py,代码这样看着就很简洁 1.调用win32的api ...

  3. python内置函数open_Python学习教程:Python内置函数大总结(下篇)

    这里接着上次的 Python学习教程,给大家总结了Python 剩下的33个内置函数. 31 hash() 返回对象的哈希值 In [112]: hash(xiaoming)Out[112]: 613 ...

  4. python 内置函数 builtins_python学习笔记(七)——内置函数

    builtins.py模块,是python的内建模块,在运行时会自动导入该模块.在该模块中定义了很多我们常用的内置函数,比如print,input 等. 在 builtins.py 模块中给出如下注释 ...

  5. python内置库之学习configparser库(一)

    python内置库之学习configparser库(一) 1.引言 ini文件简介 [节] 键=值 注:节不能重复出现 2.自己封装了一个增删改查的类,可以参考一下 import configpars ...

  6. python内置标准库不可以处理的文件是_精华 | 140种Python标准库、第三方库和外部工具都有了...

    原标题:精华 | 140种Python标准库.第三方库和外部工具都有了 作者 | 宋天龙 来源 | 大数据(ID:hzdashuju) [导读]Python数据工具箱涵盖从数据源到数据可视化的完整流程 ...

  7. random输出1到10之间_第43P,随机数,Python内置库之random

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第43篇文章,第二阶段的课程:Python基础知识:Python内置库之random随机库. 学习本课程,建议先看一遍:[计算机基础 ...

  8. python内置函数用来返回列表、元组、字典_python程序设计第一章基础知识 题库及选解...

    由于学校的python是笔试,所以找了份感觉比较好的题库刷了下其中前八章的填空和判断,附上选解.各章链接如下 填空 1. Python安装扩展库常用的是()工具.(pip) 2. Python标准库m ...

  9. python内置库有哪些_python 内置库

    广告关闭 回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你! version: 0. 2.0, configurations: }, de ...

最新文章

  1. char s[0] do{}while(0)
  2. CSS浏览器兼容性问题
  3. C/C++——输入输出字符相关,cin.get()、getchar()和cin.getline()
  4. HDOJ2035 人见人爱A^B
  5. BZOJ4545: DQS的trie 广义后缀自动机_LCT
  6. Lync和Exchange 2013集成PART4:配置统一存档
  7. 三款最安全的Linux操作系统(适合从事网络安全工作者使用)
  8. Mybatis plus 开启日志
  9. c++ 构造函数数组_从 JS 数组操作到 V8 array.js
  10. linux 扩展挂载盘大小_Linux 挂载新添加磁盘LVM配置
  11. 基于C#的socket编程的TCP异步实现
  12. 微型计算机控制技术第二版答案第四章,微型计算机控制技术答案第四章2.pdf
  13. 修改jsp文件刷新网页没有更新
  14. VS2005 安装 WTL80
  15. java分布式日志组件
  16. 163电子邮箱怎么注册申请?手机号注册电子邮箱的小技巧
  17. 微信订阅号之1-注册
  18. 软件与哲学(2)——对不同世界的抽象
  19. MFC打印及打印预览
  20. [搜索] Solr (三) 全量索引与增量索引

热门文章

  1. kotlin设置CORS跨域资源共享,java设置允许跨域,服务端如何设置 springboot中设置跨域资源共享
  2. 2021-2027年中国室内定位市场研究及前瞻分析报告
  3. 【转载】首次作品展小结
  4. Windows 64位下安装Redis详细教程
  5. 虚拟机环境下Centos7操作系统的详细安装教程
  6. matplotlib绘制热力图
  7. LeetCode简单题之机器人能否返回原点
  8. MindSpore静态图语法支持
  9. 拥挤场景中的目标检测
  10. 2021年大数据Flink(十五):流批一体API Connectors ​​​​​​​Kafka