在 Python 中获取 Linux 系统信息有多种方法,从使用内置的第三方库到直接解析系统文件,再到调用系统命令,下面我将为你详细介绍几种主流且实用的方法。

使用 psutil 库 (推荐)
psutil (Process and System Utilities) 是一个跨平台的库,用于获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等),它是 Python 中获取系统信息最常用、最强大的库之一。
安装 psutil
pip install psutil
使用示例
以下代码展示了如何使用 psutil 获取各种系统信息。

import psutil
import platform
from datetime import datetime
def get_system_info():
"""收集并打印系统信息"""
print("=" * 40, "系统信息", "=" * 40)
# 1. 操作系统信息
print(f"操作系统: {platform.system()} {platform.release()} ({platform.version()})")
print(f"架构: {platform.machine()}")
print(f"处理器: {platform.processor()}")
print(f"主机名: {platform.node()}")
# 2. CPU 信息
print("\n" + "=" * 40, "CPU 信息", "=" * 40)
print(f"物理核心数: {psutil.cpu_count(logical=False)}")
print(f"逻辑核心数: {psutil.cpu_count(logical=True)}")
print(f"当前CPU使用率: {psutil.cpu_percent(interval=1)}%")
print(f"CPU频率: {psutil.cpu_freq().current:.2f} Mhz")
# 3. 内存信息
print("\n" + "=" * 40, "内存信息", "=" * 40)
mem = psutil.virtual_memory()
print(f"总内存: {mem.total / (1024**3):.2f} GB")
print(f"可用内存: {mem.available / (1024**3):.2f} GB")
print(f"已用内存: {mem.used / (1024**3):.2f} GB ({mem.percent}%)")
# 4. 磁盘信息
print("\n" + "=" * 40, "磁盘信息", "=" * 40)
for partition in psutil.disk_partitions():
try:
usage = psutil.disk_usage(partition.mountpoint)
print(f"设备: {partition.device}")
print(f" 挂载点: {partition.mountpoint}")
print(f" 文件系统类型: {partition.fstype}")
print(f" 总大小: {usage.total / (1024**3):.2f} GB")
print(f" 已用: {usage.used / (1024**3):.2f} GB ({usage.percent}%)")
print(f" 可用: {usage.free / (1024**3):.2f} GB")
except PermissionError:
# 处理没有权限访问的挂载点(如 /snap)
print(f"设备: {partition.device} (无权限访问)")
# 5. 网络信息
print("\n" + "=" * 40, "网络信息", "=" * 40)
net_io = psutil.net_io_counters()
print(f"总发送字节数: {net_io.bytes_sent / (1024**2):.2f} MB")
print(f"总接收字节数: {net_io.bytes_recv / (1024**2):.2f} MB")
# 6. 启动时间
print("\n" + "=" * 40, "系统启动时间", "=" * 40)
boot_time_timestamp = psutil.boot_time()
boot_time = datetime.fromtimestamp(boot_time_timestamp).strftime('%Y-%m-%d %H:%M:%S')
print(f"系统启动时间: {boot_time}")
if __name__ == '__main__':
get_system_info()
优点:
- 跨平台: 同样的代码在 Linux, Windows, macOS 上都能运行。
- 简单易用: API 设计直观,封装了底层细节。
- 功能全面: 能获取 CPU、内存、磁盘、网络、进程等几乎所有信息。
解析 /proc 和 /sys 文件 (Linux 特有)
在 Linux 中,/proc 和 /sys 是虚拟文件系统,它们提供了内核和系统运行时的信息,直接读取这些文件是获取底层信息的另一种方式。
/proc 文件系统示例
/proc 包含了关于进程和系统信息的动态数据。

import os
def get_proc_info():
"""从 /proc 文件系统获取信息"""
print("\n" + "=" * 40, "从 /proc 获取信息", "=" * 40)
# 1. 获取CPU信息 (从 /proc/cpuinfo)
print("\n--- CPU 信息 (/proc/cpuinfo) ---")
with open('/proc/cpuinfo', 'r') as f:
cpu_info = f.read()
# 打印前几行,通常包含CPU型号
for line in cpu_info.splitlines()[:10]:
if line.strip():
print(line)
# 2. 获取内存信息 (从 /proc/meminfo)
print("\n--- 内存信息 (/proc/meminfo) ---")
with open('/proc/meminfo', 'r') as f:
mem_info = f.read()
# 打印关键内存项
for line in mem_info.splitlines():
if line.startswith('MemTotal:') or \
line.startswith('MemAvailable:') or \
line.startswith('MemFree:'):
print(line)
# 3. 获取内核版本 (从 /proc/version)
print("\n--- 内核版本 (/proc/version) ---")
with open('/proc/version', 'r') as f:
print(f.read().strip())
# 4. 获取启动时间 (从 /proc/uptime)
print("\n--- 系统运行时间 (/proc/uptime) ---")
with open('/proc/uptime', 'r') as f:
uptime_seconds = float(f.read().split()[0])
uptime_days = int(uptime_seconds // 86400)
uptime_hours = int((uptime_seconds % 86400) // 3600)
print(f"系统已运行: {uptime_days} 天, {uptime_hours} 小时")
if __name__ == '__main__':
get_proc_info()
/sys 文件系统示例
/sys 主要包含关于设备、驱动程序和内核子系统(如 CPU、内存)的信息。
def get_sys_info():
"""从 /sys 文件系统获取信息"""
print("\n" + "=" * 40, "从 /sys 获取信息", "=" * 40)
# 1. 获取CPU频率 (从 /sys/devices/system/cpu/)
print("\n--- CPU 频率 (/sys/devices/system/cpu/) ---")
try:
# 通常第一个CPU核心是 cpu0
cpu_freq_path = '/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq'
with open(cpu_freq_path, 'r') as f:
current_freq_khz = int(f.read().strip())
current_freq_mhz = current_freq_khz / 1000
print(f"当前CPU频率: {current_freq_mhz:.2f} MHz")
except FileNotFoundError:
print("无法找到CPU频率文件,可能系统不支持或CPU处于节能模式。")
# 2. 获取负载平均值 (从 /proc/loadavg,但信息在 /sys 中也有体现)
# 这里我们展示一个更通用的方法
print("\n--- 系统负载平均值 (/proc/loadavg) ---")
with open('/proc/loadavg', 'r') as f:
load_avg = f.read().strip()
print(f"1分钟, 5分钟, 15分钟负载: {load_avg.split()[:3]}")
if __name__ == '__main__':
get_sys_info()
优点:
- 无需安装库: 是 Python 标准库的功能,无需
pip install。 - 底层信息: 可以获取到
psutil可能没有提供的、更底层的内核参数。 - 轻量级: 直接读取文件,开销小。
缺点:
- 平台特定: 只适用于 Linux。
- 文件路径复杂: 需要了解
/proc和/sys的文件结构。 - 解析麻烦: 文件内容通常是纯文本,需要手动解析。
调用 subprocess 执行系统命令
Python 库无法满足需求,或者你习惯于使用熟悉的 Linux 命令,可以使用 subprocess 模块来执行命令并获取其输出。
安装 subprocess
subprocess 是 Python 标准库的一部分,无需安装。
使用示例
import subprocess
def get_info_via_command():
"""通过执行命令获取信息"""
print("\n" + "=" * 40, "通过命令获取信息", "=" * 40)
# 1. 获取发行版信息 (使用 lsb_release)
try:
result = subprocess.run(['lsb_release', '-a'], capture_output=True, text=True, check=True)
print("\n--- 发行版信息 (lsb_release -a) ---")
print(result.stdout)
except (subprocess.CalledProcessError, FileNotFoundError):
# lsb_release 不存在,尝试解析 /etc/os-release
print("\n--- 发行版信息 (/etc/os-release) ---")
try:
with open('/etc/os-release', 'r') as f:
for line in f:
if line.startswith('PRETTY_NAME'):
print(line.strip())
except FileNotFoundError:
print("无法获取发行版信息。")
# 2. 获取磁盘使用情况 (使用 df -h)
print("\n--- 磁盘使用情况 (df -h) ---")
try:
result = subprocess.run(['df', '-h'], capture_output=True, text=True, check=True)
print(result.stdout)
except (subprocess.CalledProcessError, FileNotFoundError):
print("无法执行 df 命令。")
# 3. 获取网络接口信息 (使用 ip a)
print("\n--- 网络接口信息 (ip a) ---")
try:
result = subprocess.run(['ip', 'a'], capture_output=True, text=True, check=True)
print(result.stdout)
except (subprocess.CalledProcessError, FileNotFoundError):
print("无法执行 ip 命令。")
if __name__ == '__main__':
get_info_via_command()
优点:
- 功能无限: 可以执行任何 Linux 命令,功能不受限制。
- 熟悉度: 对于熟悉命令行的开发者来说非常直观。
缺点:
- 性能开销: 创建新进程比调用库函数要慢。
- 安全性: 如果命令参数来自不可信的输入,存在命令注入风险。
- 平台特定: 严重依赖 Linux 命令,不跨平台。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
psutil 库 |
跨平台、简单易用、功能全面 | 需要安装第三方库 | 绝大多数情况下的首选,推荐用于脚本、应用和监控工具。 |
解析 /proc 和 /sys |
无需安装、底层信息、轻量级 | 平台特定、文件路径复杂、解析麻烦 | 需要获取 psutil 未提供的特定内核参数时,或在不允许安装依赖的环境下。 |
subprocess 命令 |
功能无限、利用熟悉命令 | 性能开销、有安全风险、不跨平台 | 需要调用特定命令行工具,或 psutil 无法满足的复杂需求。 |
最终建议:
对于绝大多数 Python 项目,强烈推荐使用 psutil 库,它提供了最平衡的解决方案,兼顾了易用性、功能性和跨平台性,只有在需要获取非常特定的、psutil 未覆盖的内核信息时,才考虑直接解析 /proc 或 /sys 文件。
