本文目录导读:

Python系统信息案例详解:如何高效获取电脑系统信息
目录导读
-
为什么选择Python获取系统信息?
-
必备库与基础环境配置
-
获取操作系统基础信息
-
获取CPU与内存详细信息
-
获取磁盘与网络信息
-
常见问题解答(Q&A)
-
总结与最佳实践
为什么选择Python获取系统信息?
在日常开发、运维监控或自动化脚本中,快速获取电脑系统信息是一项高频需求,Python凭借其丰富的标准库和第三方模块,成为实现这一目标的理想语言,无论你是需要获取操作系统版本、CPU使用率,还是磁盘空间、网络接口状态,Python都能以简洁的代码完成,更重要的是,Python跨平台特性(Windows、macOS、Linux)确保同一套脚本几乎无需修改即可在不同系统上运行,大幅降低维护成本。
与手动操作或使用命令行工具相比,Python系统信息采集可以实现定时抓取、日志记录、触发告警等高级功能,尤其适合自动化运维(AIOps)、设备监控、性能分析等真实场景,以下案例将从基础到进阶,全方位展示如何用Python提取电脑系统信息的精华。
必备库与基础环境配置
在开始案例前,需安装核心依赖库psutil(Python System and Process Utilities),该库封装了系统调用,提供CPU、内存、磁盘、网络、进程等全方位信息。
pip install psutil
标准库中的platform、socket、os等模块也会用到,它们无需额外安装,建议在Python 3.6及以上版本中运行代码,若需可视化或导出信息,还可搭配json、csv、matplotlib等库。
案例一:获取操作系统基础信息
第一个案例演示如何快速获取电脑的操作系统名称、版本、架构、主机名、运行时间等基础信息。
import platform
import socket
import psutil
import datetime
def get_base_info():
info = {}
info['系统名称'] = platform.system()
info['系统版本'] = platform.version()
info['架构'] = platform.machine()
info['处理器'] = platform.processor()
info['主机名'] = socket.gethostname()
# 系统启动时间
boot_time = datetime.datetime.fromtimestamp(psutil.boot_time())
info['系统启动时间'] = boot_time.strftime("%Y-%m-%d %H:%M:%S")
# 开机时长(天)
uptime_days = (datetime.datetime.now() - boot_time).days
info['已运行天数'] = f"{uptime_days}天"
return info
for k, v in get_base_info().items():
print(f"{k}: {v}")
输出示例:
系统名称: Windows
系统版本: 10.0.19045
架构: AMD64
处理器: Intel64 Family 6 Model 158 Stepping 10, GenuineIntel
主机名: DESKTOP-ABC123
系统启动时间: 2025-02-21 08:30:12
已运行天数: 5天
此代码利用platform模块获取跨平台常量,psutil.boot_time()返回启动时间戳,结合datetime计算运行时长。
案例二:获取CPU与内存详细信息
CPU与内存是系统性能的核心指标,本案例将获取CPU物理核心数、逻辑核心数、使用率(百分比)、频率,以及内存总量、已用、可用空间。
import psutil
def get_cpu_memory_info():
cpu_info = {}
# CPU信息
cpu_info['物理核心数'] = psutil.cpu_count(logical=False)
cpu_info['逻辑核心数'] = psutil.cpu_count(logical=True)
cpu_info['当前使用率(%)'] = psutil.cpu_percent(interval=1) # 采样1秒
cpu_freq = psutil.cpu_freq()
if cpu_freq:
cpu_info['当前频率(MHz)'] = cpu_freq.current
cpu_info['最大频率(MHz)'] = cpu_freq.max
# 内存信息
mem = psutil.virtual_memory()
mem_info = {
'内存总量(GB)': round(mem.total / (1024**3), 2),
'已用内存(GB)': round(mem.used / (1024**3), 2),
'可用内存(GB)': round(mem.available / (1024**3), 2),
'内存使用率(%)': mem.percent,
}
return cpu_info, mem_info
cpu, mem = get_cpu_memory_info()
print("CPU信息:", cpu)
print("内存信息:", mem)
输出示例:
CPU信息: {'物理核心数': 4, '逻辑核心数': 8, '当前使用率(%)': 23.0, '当前频率(MHz)': 2496.0, '最大频率(MHz)': 4100.0}
内存信息: {'内存总量(GB)': 16.0, '已用内存(GB)': 8.45, '可用内存(GB)': 7.55, '内存使用率(%)': 52.8}
关键点:psutil.cpu_percent(interval=1)需要等待1秒完成采样,以获得准确瞬时负载。psutil.virtual_memory()返回类似命名元组的对象,包含total、used、available、percent等字段。
案例三:获取磁盘与网络信息
磁盘和网络信息对存储管理和网络诊断至关重要,以下代码获取所有磁盘分区的使用情况,以及网络接口的IP地址、发送/接收字节数。
import psutil
import socket
def get_disk_network_info():
# 磁盘信息
disk_info = {}
for part in psutil.disk_partitions():
if part.mountpoint:
usage = psutil.disk_usage(part.mountpoint)
disk_info[part.mountpoint] = {
'总容量(GB)': round(usage.total / 1024**3, 2),
'已用(GB)': round(usage.used / 1024**3, 2),
'可用(GB)': round(usage.free / 1024**3, 2),
'使用率(%)': usage.percent,
'文件系统': part.fstype,
}
# 网络信息(只取IPv4)
net_info = {}
for interface, addrs in psutil.net_if_addrs().items():
for addr in addrs:
if addr.family == socket.AF_INET:
net_info[interface] = {'IP地址': addr.address}
# 整体网络IO统计
net_io = psutil.net_io_counters()
net_info['全局统计'] = {
'发送总字节(MB)': round(net_io.bytes_sent / 1024**2, 2),
'接收总字节(MB)': round(net_io.bytes_recv / 1024**2, 2),
'发送总包数': net_io.packets_sent,
'接收总包数': net_io.packets_recv,
}
return disk_info, net_info
disk, net = get_disk_network_info()
print("磁盘信息:", disk)
print("网络信息:", net)
输出示例(部分):
磁盘信息: {'C:\\': {'总容量(GB)': 238.46, '已用(GB)': 128.3, '可用(GB)': 110.16, '使用率(%)': 53.8, '文件系统': 'NTFS'}, 'D:\\': ...}
网络信息: {'以太网': {'IP地址': '192.168.1.100'}, 'Wi-Fi': {'IP地址': '172.16.0.5'}, '全局统计': {'发送总字节(MB)': 12548.3, '接收总字节(MB)': 36528.9, ...}}
此案例展示了psutil.disk_partitions()自动过滤无效挂载点(如Linux的/sys、/proc),仅返回实际分区,网络接口过滤IPv4地址需匹配socket.AF_INET,IPv6地址可用socket.AF_INET6。
常见问题解答(Q&A)
问题1:为什么psutil.cpu_percent()返回过高的值?
回答:首次调用该函数且interval设置为0时,可能返回0或瞬时值,推荐设置interval=1(等待1秒)以获取真实平均负载,若需连续监控,可循环调用并取多次均值。
问题2:如何获取GPU信息(如显存、显卡型号)?
回答:psutil原生不支持GPU,可使用第三方库GPUtil(只支持NVIDIA)、pynvml(NVIDIA的Python绑定)或wmi(Windows下获取WMI类),示例:pip install gputil,然后import GPUtil; GPUtil.getGPUs()。
问题3:如何在Linux/macOS上兼容运行?
回答:以上案例全部基于跨平台库psutil和platform,在三大主流操作系统上均可运行,无需修改代码,唯一区别是磁盘挂载点路径(Windows为驱动器号,Linux/macOS为或/mnt等)。
问题4:如何将系统信息导出为JSON文件?
回答:将获取的字典用json.dump()写入文件,
import json
info = get_base_info() # 或其他函数返回值
with open('sys_info.json', 'w') as f:
json.dump(info, f, ensure_ascii=False, indent=4)
问题5:为什么磁盘总量与实际硬盘标称不一致?
回答:硬盘厂商使用十进制计算(1GB=1,000,000,000字节),而操作系统和psutil使用二进制计算(1GiB=1,073,741,824字节),导致数值差异,这是正常现象。
总结与最佳实践
通过以上三个案例,你已经掌握了使用Python获取电脑系统信息的核心方法,总结关键原则:
- 推荐优先使用
psutil:它抽象了平台差异,提供简洁API。 - 标准库作为补充:
platform用于基础OS信息,socket用于网络类型判断。 - 注意权限:某些信息(如进程详细内存、网卡状态)需要管理员/root权限。
- 采集频率控制:避免高频调用
psutil.cpu_percent(interval=1)造成性能开销,生产环境建议间隔5秒以上。
最佳实践建议:将信息采集封装为函数,定期写入日志或数据库,结合告警规则(如内存使用率>90%触发警报)可构建轻量级监控系统,可尝试扩展获取进程列表、硬件温度(需psutil.sensors_temperatures(),仅Linux)、电池信息等,以满足更复杂的需求。
掌握Python系统信息采集,你不仅能在日常开发中快速诊断问题,还能为自动化运维和数据可视化奠定坚实基础,立即运行上述代码,探索你的电脑隐藏的细节吧!