杰瑞科技汇

Python如何获取Linux系统信息?

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

Python如何获取Linux系统信息?-图1
(图片来源网络,侵删)

使用 psutil 库 (推荐)

psutil (Process and System Utilities) 是一个跨平台的库,用于获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等),它是 Python 中获取系统信息最常用、最强大的库之一。

安装 psutil

pip install psutil

使用示例

以下代码展示了如何使用 psutil 获取各种系统信息。

Python如何获取Linux系统信息?-图2
(图片来源网络,侵删)
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 包含了关于进程和系统信息的动态数据。

Python如何获取Linux系统信息?-图3
(图片来源网络,侵删)
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 文件。

分享:
扫描分享到社交APP
上一篇
下一篇