什么是 ctypes?
ctypes 是 Python 的标准库,它让你能够调用 Windows 的底层 API 函数。简单说,就是用 Python 代码直接和操作系统对话。
你不需要安装任何第三方库,Python 自带这个功能。
代码逐行解释
第一步:导入 ctypes
这一行导入 ctypes 模块,它是 Python 和 Windows API 之间的桥梁。
第二步:定义系统信息结构体
class SYSTEM_INFO(ctypes.Structure): _fields_ = [ ("wProcessorArchitecture", ctypes.c_ushort), # 处理器架构 ("wReserved", ctypes.c_ushort), ("dwPageSize", ctypes.c_ulong), # 页大小 ("lpMinimumApplicationAddress", ctypes.c_void_p), # 程序可以使用最小地址空间 ("lpMaximumApplicationAddress", ctypes.c_void_p), # 程序可以使用最大地址空间 ("dwActiveProcessorMask", ctypes.c_void_p), # 当前激活的处理器掩码 ("dwNumberOfProcessors", ctypes.c_ulong), # 处理器数量(逻辑) ("dwProcessorType", ctypes.c_ulong), # 处理器类型 ("dwAllocationGranularity", ctypes.c_ulong), # 分配粒度 ("wProcessorLevel", ctypes.c_ushort), # 处理器级别 ("wProcessorRevision", ctypes.c_ushort), # 处理器修订版本 ]
这里定义了一个 SYSTEM_INFO 结构体,它和 Windows 系统内部的 SYSTEM_INFO 结构完全对应。
关键点: - _fields_ 告诉 Python 这个结构体包含哪些字段 - 每个字段由 (字段名,数据类型) 组成 - c_ushort 表示无符号短整型(2 字节) - c_ulong 表示无符号长整型(4 字节) - c_void_p 表示指针类型
第三步:加载 Windows 系统库
kernel32 = ctypes.windll.kernel32
kernel32.dll 是 Windows 的核心动态链接库,包含大量系统级函数。ctypes.windll.kernel32 加载这个库,让你能够调用里面的函数。
第四步:调用 GetSystemInfo 函数
system_info = SYSTEM_INFO()kernel32.GetSystemInfo(ctypes.byref(system_info))
•SYSTEM_INFO() 创建一个空的结构体实例•ctypes.byref(system_info) 获取这个实例的引用(指针)•GetSystemInfo 函数会填充这个结构体,把系统信息写进去注意: Windows API 函数通常通过指针参数返回数据,而不是直接返回值。
第五步:打印结果
print(f"处理器架构:{system_info.wProcessorArchitecture}")print(f"页面大小:{system_info.dwPageSize}")print(f"处理器数量:{system_info.dwNumberOfProcessors}")
从填充好的结构体中读取字段值并打印。
运行结果示例
字段说明: - wProcessorArchitecture = 9 表示 AMD64 架构(64 位系统) - dwPageSize = 4096 表示内存页大小为 4KB - dwNumberOfProcessors = 8 表示有 8 个逻辑处理器
完整代码
import ctypes# 获取当前 Windows 系统的版本信息def get_windows_system_info():# 创建一个结构体用来存储系统信息class SYSTEM_INFO(ctypes.Structure): _fields_ = [ ("wProcessorArchitecture", ctypes.c_ushort), # 处理器架构 ("wReserved", ctypes.c_ushort), ("dwPageSize", ctypes.c_ulong), # 页大小 ("lpMinimumApplicationAddress", ctypes.c_void_p), # 程序可以使用最小地址空间 ("lpMaximumApplicationAddress", ctypes.c_void_p), # 程序可以使用最大地址空间 ("dwActiveProcessorMask", ctypes.c_void_p), # 当前激活的处理器掩码 ("dwNumberOfProcessors", ctypes.c_ulong), # 处理器数量(逻辑) ("dwProcessorType", ctypes.c_ulong), # 处理器类型 ("dwAllocationGranularity", ctypes.c_ulong), # 分配粒度 ("wProcessorLevel", ctypes.c_ushort), # 处理器级别 ("wProcessorRevision", ctypes.c_ushort), # 处理器修订版本 ]# 加载 kernel32.dll 库 kernel32 = ctypes.windll.kernel32# 创建 SYSTEM_INFO 实例 system_info = SYSTEM_INFO()# 调用 GetSystemInfo 函数填充系统信息 kernel32.GetSystemInfo(ctypes.byref(system_info))# 返回系统信息的字段return system_info# 调用函数并打印结果system_info = get_windows_system_info()print(f"处理器架构:{system_info.wProcessorArchitecture}")print(f"页面大小:{system_info.dwPageSize}")print(f"处理器数量:{system_info.dwNumberOfProcessors}")
核心知识点总结
| |
|---|
ctypes | Python 标准库,用于调用 C 语言编写的动态链接库 |
Structure | |
_fields_ | |
windll.kernel32 | 加载 Windows kernel32.dll 库 |
byref() | |
GetSystemInfo | Windows API 函数,填充 SYSTEM_INFO 结构体 |
这就是使用 Python 标准库获取 Windows 系统信息的全部过程。无需第三方库,纯原生实现。