如何在Python中获取硬件和系统信息(详细教程)

使用platform、psutil 和 gputil 库在 Python 中提取和获取所有系统和硬件信息,包括Python获取硬件和系统信息示例,例如操作系统详细信息、CPU 和 GPU 信息、磁盘和网络使用情况。
如何在Python中获取硬件和系统信息?作为 Python 开发人员,使用第三方库来完成你真正想要的工作是很方便的,而不是每次都重新发明轮子。在本教程中,你将熟悉psutil,它是用于 Python 中进程和系统监控的 ross-platform 库,以及用于在 Python 中提取系统和硬件信息的内置platform模块。
最后,我将向你展示如何打印 GPU 信息(当然,如果你有的话)。
Python如何获取硬件和系统信息?在 Linux 中有非常流行的提取系统和硬件信息的工具,例如lshw、uname和hostnamectl。但是,我们将在 Python 中使用psutil库,因此它可以在所有操作系统上运行并获得几乎相同的结果。
这是本教程的目录:

  1. 系统信息
  2. CPU信息
  3. 内存使用情况
  4. 磁盘使用情况
  5. 网络信息
  6. GPU信息
相关:  如何使用 ipaddress 模块在 Python 中操作 IP 地址。
在我们深入研究之前,你需要安装 psutil:
pip3 install psutil

打开一个新的 python 文件,让我们开始,导入必要的模块:
import psutil import platform from datetime import datetime

让我们制作一个函数,将大量字节转换为缩放格式(例如,以千、百万、千兆等为单位):
def get_size(bytes, suffix="B"): """ Scale bytes to its proper format e.g: 1253656 => '1.20MB' 1253656678 => '1.17GB' """ factor = 1024 for unit in [ "", "K", "M", "G", "T", "P"]: if bytes < factor: return f"{bytes:.2f}{unit}{suffix}" bytes /= factor

系统信息Python获取硬件和系统信息示例:我们在这里需要platform模块:
print("="*40, "System Information", "="*40) uname = platform.uname() print(f"System: {uname.system}") print(f"Node Name: {uname.node}") print(f"Release: {uname.release}") print(f"Version: {uname.version}") print(f"Machine: {uname.machine}") print(f"Processor: {uname.processor}")

获取计算机启动的日期和时间:
# Boot Time print("="*40, "Boot Time", "="*40) boot_time_timestamp = psutil.boot_time() bt = datetime.fromtimestamp(boot_time_timestamp) print(f"Boot Time: {bt.year}/{bt.month}/{bt.day} {bt.hour}:{bt.minute}:{bt.second}")

CPU信息Python如何获取硬件和系统信息?让我们获取一些 CPU 信息,例如总内核数、使用情况等:
# let's print CPU information print("="*40, "CPU Info", "="*40) # number of cores print("Physical cores:", psutil.cpu_count(logical=False)) print("Total cores:", psutil.cpu_count(logical=True)) # CPU frequencies cpufreq = psutil.cpu_freq() print(f"Max Frequency: {cpufreq.max:.2f}Mhz") print(f"Min Frequency: {cpufreq.min:.2f}Mhz") print(f"Current Frequency: {cpufreq.current:.2f}Mhz") # CPU usage print("CPU Usage Per Core:") for i, percentage in enumerate(psutil.cpu_percent(percpu=True, interval=1)): print(f"Core {i}: {percentage}%") print(f"Total CPU Usage: {psutil.cpu_percent()}%")

psutil的cpu_count()函数返回内核数,而cpu_freq()函数返回 CPU 频率,namedtuple包括以 Mhz 表示的当前、最小和最大频率,你可以设置percpu=True为获取每个 CPU 频率。
cpu_percent()方法返回一个浮点数,表示当前 CPU 利用率的百分比,设置interval为 1(秒)将比较一秒前后经过的系统 CPU 时间,我们设置percpuTrue以获取每个内核的 CPU 使用率。
内存使用情况
# Memory Information print("="*40, "Memory Information", "="*40) # get the memory details svmem = psutil.virtual_memory() print(f"Total: {get_size(svmem.total)}") print(f"Available: {get_size(svmem.available)}") print(f"Used: {get_size(svmem.used)}") print(f"Percentage: {svmem.percent}%") print("="*20, "SWAP", "="*20) # get the swap memory details (if exists) swap = psutil.swap_memory() print(f"Total: {get_size(swap.total)}") print(f"Free: {get_size(swap.free)}") print(f"Used: {get_size(swap.used)}") print(f"Percentage: {swap.percent}%")

如何在Python中获取硬件和系统信息?virtual_memory()方法返回有关系统内存使用情况的统计信息namedtuple,包括(可用total物理内存总量)、available(可用内存,即未使用)usedpercent(即百分比)等字段。swap_memory()是相同的,但用于交换内存。
我们使用先前定义的get_size()函数以缩放方式打印值,因为这些统计信息以字节表示。
磁盘使用情况
# Disk Information print("="*40, "Disk Information", "="*40) print("Partitions and Usage:") # get all disk partitions partitions = psutil.disk_partitions() for partition in partitions: print(f"=== Device: {partition.device} ===") print(f"Mountpoint: {partition.mountpoint}") print(f"File system type: {partition.fstype}") try: partition_usage = psutil.disk_usage(partition.mountpoint) except PermissionError: # this can be catched due to the disk that # isn't ready continue print(f"Total Size: {get_size(partition_usage.total)}") print(f"Used: {get_size(partition_usage.used)}") print(f"Free: {get_size(partition_usage.free)}") print(f"Percentage: {partition_usage.percent}%") # get IO statistics since boot disk_io = psutil.disk_io_counters() print(f"Total read: {get_size(disk_io.read_bytes)}") print(f"Total write: {get_size(disk_io.write_bytes)}")

正如预期的那样,disk_usage()函数将磁盘使用统计信息返回为namedtuple,包括totalused以及free以字节表示的空间。
Python获取硬件和系统信息示例:网络信息
# Network information print("="*40, "Network Information", "="*40) # get all network interfaces (virtual and physical) if_addrs = psutil.net_if_addrs() for interface_name, interface_addresses in if_addrs.items(): for address in interface_addresses: print(f"=== Interface: {interface_name} ===") if str(address.family) == 'AddressFamily.AF_INET': print(f"IP Address: {address.address}") print(f"Netmask: {address.netmask}") print(f"Broadcast IP: {address.broadcast}") elif str(address.family) == 'AddressFamily.AF_PACKET': print(f"MAC Address: {address.address}") print(f"Netmask: {address.netmask}") print(f"Broadcast MAC: {address.broadcast}") # get IO statistics since boot net_io = psutil.net_io_counters() print(f"Total Bytes Sent: {get_size(net_io.bytes_sent)}") print(f"Total Bytes Received: {get_size(net_io.bytes_recv)}")

net_if_addrs()函数返回与系统上安装的每个网络接口卡关联的地址。
Python如何获取硬件和系统信息?这是我个人 Linux 机器的结果输出:
======================================== System Information ======================================== System: Linux Node Name: rockikz Release: 4.17.0-kali1-amd64 Version: #1 SMP Debian 4.17.8-1kali1 (2018-07-24) Machine: x86_64 Processor: ======================================== Boot Time ======================================== Boot Time: 2019/8/21 9:37:26 ======================================== CPU Info ======================================== Physical cores: 4 Total cores: 4 Max Frequency: 3500.00Mhz Min Frequency: 1600.00Mhz Current Frequency: 1661.76Mhz CPU Usage Per Core: Core 0: 0.0% Core 1: 0.0% Core 2: 11.1% Core 3: 0.0% Total CPU Usage: 3.0% ======================================== Memory Information ======================================== Total: 3.82GB Available: 2.98GB Used: 564.29MB Percentage: 21.9% ==================== SWAP ==================== Total: 0.00B Free: 0.00B Used: 0.00B Percentage: 0% ======================================== Disk Information ======================================== Partitions and Usage: === Device: /dev/sda1 === Mountpoint: / File system type: ext4 Total Size: 451.57GB Used: 384.29GB Free: 44.28GB Percentage: 89.7% Total read: 2.38GB Total write: 2.45GB ======================================== Network Information ======================================== === Interface: lo === IP Address: 127.0.0.1 Netmask: 255.0.0.0 Broadcast IP: None === Interface: lo === === Interface: lo === MAC Address: 00:00:00:00:00:00 Netmask: None Broadcast MAC: None === Interface: wlan0 === IP Address: 192.168.1.101 Netmask: 255.255.255.0 Broadcast IP: 192.168.1.255 === Interface: wlan0 === === Interface: wlan0 === MAC Address: 64:70:02:07:40:50 Netmask: None Broadcast MAC: ff:ff:ff:ff:ff:ff === Interface: eth0 === MAC Address: d0:27:88:c6:06:47 Netmask: None Broadcast MAC: ff:ff:ff:ff:ff:ff Total Bytes Sent: 123.68MB Total Bytes Received: 577.94MB

如果你使用的是笔记本电脑,则可以使用  psutil.sensors_battery()  获取电池信息。
另外,如果你是一个Linux用户,你可以使用psutil.sensors_fan()来获得风扇的RPM(每分钟转数)  ,也  psutil.sensors_temperatures()来获得各种设备的温度。
GPU信息如何在Python中获取硬件和系统信息?psutil不向我们提供 GPU 信息。因此,我们需要安装GPUtil:
pip3 install gputil

Python获取硬件和系统信息示例介绍:GPUtil是一个 Python 模块,仅用于获取 NVIDIA GPU 的 GPU 状态,它定位计算机上的所有 GPU,确定它们的可用性,并返回可用 GPU 的有序列表。它需要安装最新的 NVIDIA 驱动程序。
此外,我们需要安装tabulate 模块,这将允许我们以表格方式打印 GPU 信息:
pip3 install tabulate

Python如何获取硬件和系统信息?以下代码行打印你机器中的所有 GPU 及其详细信息:
# GPU information import GPUtil from tabulate import tabulate print("="*40, "GPU Details", "="*40) gpus = GPUtil.getGPUs() list_gpus = [ ] for gpu in gpus: # get the GPU id gpu_id = gpu.id # name of GPU gpu_name = gpu.name # get % percentage of GPU usage of that GPU gpu_load = f"{gpu.load*100}%" # get free memory in MB format gpu_free_memory = f"{gpu.memoryFree}MB" # get used memory gpu_used_memory = f"{gpu.memoryUsed}MB" # get total memory gpu_total_memory = f"{gpu.memoryTotal}MB" # get GPU temperature in Celsius gpu_temperature = f"{gpu.temperature} °C" gpu_uuid = gpu.uuid list_gpus.append(( gpu_id, gpu_name, gpu_load, gpu_free_memory, gpu_used_memory, gpu_total_memory, gpu_temperature, gpu_uuid ))print(tabulate(list_gpus, headers=("id", "name", "load", "free memory", "used memory", "total memory", "temperature", "uuid")))

这是我机器中的输出:
======================================== GPU Details ======================================== idnameloadfree memoryused memorytotal memorytemperatureuuid ----------------------------------------------------------------------------------------------------------------------- 0GeForce GTX 10502.0%3976.0MB120.0MB4096.0MB52.0 °CGPU-c9b08d82-f1e2-40b6-fd20-543a4186d6ce

太好了,现在你可以将这些信息集成到你的 Python 监视器应用程序和实用程序中!
检查我们在本教程中使用的库的文档:
  • platform - 访问底层平台的识别数据
  • psutil 的官方文档
  • GPUtil 文档
【如何在Python中获取硬件和系统信息(详细教程)】你还可以使用psutil来  监控操作系统进程,例如每个进程的 CPU 和内存使用情况等。

    推荐阅读