当前位置:   article > 正文

在 Python 中获取硬件和系统信息_# 获取网络信息 network_info = [] for interface, addrs in

# 获取网络信息 network_info = [] for interface, addrs in psutil.net_if_addrs

作为 Python 开发人员,使用第三方库来完成您真正想要的工作是很方便的,而不是每次都重新发明轮子。在本教程中,您将熟悉psutil,它是Python 中用于进程和系统监控的跨平台库,以及用于在 Python 中提取系统和硬件信息的内置平台模块。

最后,我将向您展示如何打印 GPU 信息(当然,如果您有的话)。

这是本教程的目录:

  1. 系统信息
  2. CPU信息
  3. 内存使用情况
  4. 磁盘使用情况
  5. 网络信息
  6. 图形处理器信息

相关: 如何使用 ipaddress 模块在 Python 中操作 IP 地址

 

在我们深入研究之前,您需要安装 psutil:

pip3 install psutil
复制

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

  1. import psutil
  2. import platform
  3. from datetime import datetime
复制

让我们创建一个函数,将大量字节转换为缩放格式(例如,以千、兆、千兆等为单位):

  1. def get_size(bytes, suffix="B"):
  2. """
  3. Scale bytes to its proper format
  4. e.g:
  5. 1253656 => '1.20MB'
  6. 1253656678 => '1.17GB'
  7. """
  8. factor = 1024
  9. for unit in ["", "K", "M", "G", "T", "P"]:
  10. if bytes < factor:
  11. return f"{bytes:.2f}{unit}{suffix}"
  12. bytes /= factor
复制

系统信息

我们在这里需要平台模块:

 

  1. print("="*40, "System Information", "="*40)
  2. uname = platform.uname()
  3. print(f"System: {uname.system}")
  4. print(f"Node Name: {uname.node}")
  5. print(f"Release: {uname.release}")
  6. print(f"Version: {uname.version}")
  7. print(f"Machine: {uname.machine}")
  8. print(f"Processor: {uname.processor}")
复制

获取计算机启动的日期和时间:

  1. # Boot Time
  2. print("="*40, "Boot Time", "="*40)
  3. boot_time_timestamp = psutil.boot_time()
  4. bt = datetime.fromtimestamp(boot_time_timestamp)
  5. print(f"Boot Time: {bt.year}/{bt.month}/{bt.day} {bt.hour}:{bt.minute}:{bt.second}")
复制

CPU信息

让我们获取一些 CPU 信息,例如总内核数、使用情况等:

  1. # let's print CPU information
  2. print("="*40, "CPU Info", "="*40)
  3. # number of cores
  4. print("Physical cores:", psutil.cpu_count(logical=False))
  5. print("Total cores:", psutil.cpu_count(logical=True))
  6. # CPU frequencies
  7. cpufreq = psutil.cpu_freq()
  8. print(f"Max Frequency: {cpufreq.max:.2f}Mhz")
  9. print(f"Min Frequency: {cpufreq.min:.2f}Mhz")
  10. print(f"Current Frequency: {cpufreq.current:.2f}Mhz")
  11. # CPU usage
  12. print("CPU Usage Per Core:")
  13. for i, percentage in enumerate(psutil.cpu_percent(percpu=True, interval=1)):
  14. print(f"Core {i}: {percentage}%")
  15. 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 使用率。

内存使用情况

  1. # Memory Information
  2. print("="*40, "Memory Information", "="*40)
  3. # get the memory details
  4. svmem = psutil.virtual_memory()
  5. print(f"Total: {get_size(svmem.total)}")
  6. print(f"Available: {get_size(svmem.available)}")
  7. print(f"Used: {get_size(svmem.used)}")
  8. print(f"Percentage: {svmem.percent}%")
  9. print("="*20, "SWAP", "="*20)
  10. # get the swap memory details (if exists)
  11. swap = psutil.swap_memory()
  12. print(f"Total: {get_size(swap.total)}")
  13. print(f"Free: {get_size(swap.free)}")
  14. print(f"Used: {get_size(swap.used)}")
  15. print(f"Percentage: {swap.percent}%")
复制

virtual_memory()方法返回有关系统内存使用情况的统计信息namedtuple,包括(可用total物理内存总量)、available(可用内存,即未使用)usedpercent(即百分比)等字段。swap_memory()是相同的,但用于交换内存。

 

我们使用先前定义的get_size()函数以缩放方式打印值,因为这些统计信息以字节表示。

 

磁盘使用情况

  1. # Disk Information
  2. print("="*40, "Disk Information", "="*40)
  3. print("Partitions and Usage:")
  4. # get all disk partitions
  5. partitions = psutil.disk_partitions()
  6. for partition in partitions:
  7. print(f"=== Device: {partition.device} ===")
  8. print(f" Mountpoint: {partition.mountpoint}")
  9. print(f" File system type: {partition.fstype}")
  10. try:
  11. partition_usage = psutil.disk_usage(partition.mountpoint)
  12. except PermissionError:
  13. # this can be catched due to the disk that
  14. # isn't ready
  15. continue
  16. print(f" Total Size: {get_size(partition_usage.total)}")
  17. print(f" Used: {get_size(partition_usage.used)}")
  18. print(f" Free: {get_size(partition_usage.free)}")
  19. print(f" Percentage: {partition_usage.percent}%")
  20. # get IO statistics since boot
  21. disk_io = psutil.disk_io_counters()
  22. print(f"Total read: {get_size(disk_io.read_bytes)}")
  23. print(f"Total write: {get_size(disk_io.write_bytes)}")
复制

正如预期的那样,disk_usage()函数将磁盘使用统计信息返回为namedtuple,包括totalused以及free以字节表示的空间。

网络信息

  1. # Network information
  2. print("="*40, "Network Information", "="*40)
  3. # get all network interfaces (virtual and physical)
  4. if_addrs = psutil.net_if_addrs()
  5. for interface_name, interface_addresses in if_addrs.items():
  6. for address in interface_addresses:
  7. print(f"=== Interface: {interface_name} ===")
  8. if str(address.family) == 'AddressFamily.AF_INET':
  9. print(f" IP Address: {address.address}")
  10. print(f" Netmask: {address.netmask}")
  11. print(f" Broadcast IP: {address.broadcast}")
  12. elif str(address.family) == 'AddressFamily.AF_PACKET':
  13. print(f" MAC Address: {address.address}")
  14. print(f" Netmask: {address.netmask}")
  15. print(f" Broadcast MAC: {address.broadcast}")
  16. # get IO statistics since boot
  17. net_io = psutil.net_io_counters()
  18. print(f"Total Bytes Sent: {get_size(net_io.bytes_sent)}")
  19. print(f"Total Bytes Received: {get_size(net_io.bytes_recv)}")
复制

net_if_addrs()函数返回与系统上安装的每个网络接口卡相关联的地址。

好的,这是我个人 linux 机器的结果输出:

  1. <span style="color:#212529"><span style="background-color:#ffffff"><span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-markup">======================================== System Information ========================================
  2. System: Linux
  3. Node Name: rockikz
  4. Release: 4.17.0-kali1-amd64
  5. Version: #1 SMP Debian 4.17.8-1kali1 (2018-07-24)
  6. Machine: x86_64
  7. Processor:
  8. ======================================== Boot Time ========================================
  9. Boot Time: 2019/8/21 9:37:26
  10. ======================================== CPU Info ========================================
  11. Physical cores: 4
  12. Total cores: 4
  13. Max Frequency: 3500.00Mhz
  14. Min Frequency: 1600.00Mhz
  15. Current Frequency: 1661.76Mhz
  16. CPU Usage Per Core:
  17. Core 0: 0.0%
  18. Core 1: 0.0%
  19. Core 2: 11.1%
  20. Core 3: 0.0%
  21. Total CPU Usage: 3.0%
  22. ======================================== Memory Information ========================================
  23. Total: 3.82GB
  24. Available: 2.98GB
  25. Used: 564.29MB
  26. Percentage: 21.9%
  27. ==================== SWAP ====================
  28. Total: 0.00B
  29. Free: 0.00B
  30. Used: 0.00B
  31. Percentage: 0%
  32. ======================================== Disk Information ========================================
  33. Partitions and Usage:
  34. === Device: /dev/sda1 ===
  35. Mountpoint: /
  36. File system type: ext4
  37. Total Size: 451.57GB
  38. Used: 384.29GB
  39. Free: 44.28GB
  40. Percentage: 89.7%
  41. Total read: 2.38GB
  42. Total write: 2.45GB
  43. ======================================== Network Information ========================================
  44. === Interface: lo ===
  45. IP Address: 127.0.0.1
  46. Netmask: 255.0.0.0
  47. Broadcast IP: None
  48. === Interface: lo ===
  49. === Interface: lo ===
  50. MAC Address: 00:00:00:00:00:00
  51. Netmask: None
  52. Broadcast MAC: None
  53. === Interface: wlan0 ===
  54. IP Address: 192.168.1.101
  55. Netmask: 255.255.255.0
  56. Broadcast IP: 192.168.1.255
  57. === Interface: wlan0 ===
  58. === Interface: wlan0 ===
  59. MAC Address: 64:70:02:07:40:50
  60. Netmask: None
  61. Broadcast MAC: ff:ff:ff:ff:ff:ff
  62. === Interface: eth0 ===
  63. MAC Address: d0:27:88:c6:06:47
  64. Netmask: None
  65. Broadcast MAC: ff:ff:ff:ff:ff:ff
  66. Total Bytes Sent: 123.68MB
  67. Total Bytes Received: 577.94MB</code></span></span></span></span>
复制

 

如果您使用的是笔记本电脑,则可以使用 psutil.sensors_battery() 获取电池信息。

 

另外,如果你是一个Linux用户,你可以使用 psutil.sensors_fan() 来获得风扇的RPM(每分钟转数) ,也 psutil.sensors_temperatures() 来获得各种设备的温度。

图形处理器信息

psutil不向我们提供 GPU 信息。因此,我们需要安装GPUtil

pip3 install gputil
复制

GPUtil是一个 Python 模块,仅用于获取 NVIDIA GPU 的 GPU 状态,它定位计算机上的所有 GPU,确定它们的可用性并返回可用 GPU 的有序列表。它需要安装最新的 NVIDIA 驱动程序。

此外,我们需要安装tabulate 模块,这将允许我们以表格方式打印 GPU 信息:

pip3 install tabulate
复制

 

以下代码行打印您机器中的所有 GPU 及其详细信息:

 

  1. # GPU information
  2. import GPUtil
  3. from tabulate import tabulate
  4. print("="*40, "GPU Details", "="*40)
  5. gpus = GPUtil.getGPUs()
  6. list_gpus = []
  7. for gpu in gpus:
  8. # get the GPU id
  9. gpu_id = gpu.id
  10. # name of GPU
  11. gpu_name = gpu.name
  12. # get % percentage of GPU usage of that GPU
  13. gpu_load = f"{gpu.load*100}%"
  14. # get free memory in MB format
  15. gpu_free_memory = f"{gpu.memoryFree}MB"
  16. # get used memory
  17. gpu_used_memory = f"{gpu.memoryUsed}MB"
  18. # get total memory
  19. gpu_total_memory = f"{gpu.memoryTotal}MB"
  20. # get GPU temperature in Celsius
  21. gpu_temperature = f"{gpu.temperature} °C"
  22. gpu_uuid = gpu.uuid
  23. list_gpus.append((
  24. gpu_id, gpu_name, gpu_load, gpu_free_memory, gpu_used_memory,
  25. gpu_total_memory, gpu_temperature, gpu_uuid
  26. ))
  27. print(tabulate(list_gpus, headers=("id", "name", "load", "free memory", "used memory", "total memory",
  28. "temperature", "uuid")))
复制

这是我机器中的输出:

  1. ======================================== GPU Details ========================================
  2. id name load free memory used memory total memory temperature uuid
  3. ---- ---------------- ------ ------------- ------------- -------------- ------------- ----------------------------------------
  4. 0 GeForce GTX 1050 2.0% 3976.0MB 120.0MB 4096.0MB 52.0 °C GPU-c9b08d82-f1e2-40b6-fd20-543a4186d6ce
复制

太好了,现在您可以将这些信息集成到您的 Python 监视器应用程序和实用程序中!

检查我们在本教程中使用的库的文档:

 

您还可以使用 psutil 来 监控操作系统进程,例如每个进程的 CPU 和内存使用情况等。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/156768
推荐阅读
相关标签
  

闽ICP备14008679号