📜  如何在Python制作进程监视器?

📅  最后修改于: 2022-05-13 01:55:09.394000             🧑  作者: Mango

如何在Python制作进程监视器?

进程监视器是一种显示系统信息(如进程、内存、网络和其他内容)的工具。有很多可用的工具,但我们可以使用Python制作我们自己的进程监视器。在Python,有一个名为psutil的模块,我们可以使用它来获取有关我们系统的各种信息。

需要的模块

  • psutil :在终端中键入以下命令以安装此模块。
python3 -m pip install psutil 
  • Prettytable:要在控制台上打印数据,我们可以使用格式化模块PrettyTable
python3 -m pip install prettytable

使用 psutil

psutil提供了许多功能来监视系统。我们将简要介绍其中的一些:

  • 首先,我们需要导入psutil:
import psutil
  • 列出进程 ID:
psutil.pids()  # [1,2,.....4352]
  • 获取进程信息:
process_id = 1
psutil.Process(process_id)  
# psutil.Process(pid=1, name='systemd', status='sleeping', started='19:49:25')
  • 我们可以访问这个过程的各种键:
process = psutil.Process(process_id)
process.name()
process.status()
  • 访问电池状态:
psutil.sensors_battery()    
psutil.sensors_battery().percent
  • 访问网络接口:
psutil.net_if_stats()  
psutil.net_if_stats()['wlo1'].isup    # True
  • 我们还可以检查内存:
psutil.virtual_memory()
psutil.virtual_memory().total    # 8180498432 (In Bytes)
psutil.virtual_memory().used    # 2155720704
psutil.virtual_memory().available   # 5563060224

现在我们知道了一些基本功能,我们可以实现进程监视器。创建一个新的Python文件并在其中添加以下代码。下面的代码适用于 Linux 发行版。对于其他操作系统,某些功能可能略有不同。

方法:

  • 导入所需的包。
  • 使用 subprocess 模块的 call()函数清除控制台。我们可以根据操作系统使用“clear”或“cls”命令。
  • 获取电池信息
  • 获取网络信息并将其打印为 PrettyTable
  • 获取内存信息
  • 获取进程信息
  • 创建延迟。我们使用 time.sleep(1) 创建了一个 1 秒的延迟
  • 按 CTRL+C 停止程序。

下面是实现:



Python3
# Import the required libraries
import psutil
import time
from subprocess import call
from prettytable import PrettyTable
 
# Run an infinite loop to constantly monitor the system
while True:
 
    # Clear the screen using a bash command
    call('clear')
     
    print("==============================Process Monitor\
    ======================================")
     
    # Fetch the battery information
    battery = psutil.sensors_battery().percent 
    print("----Battery Available: %d "%(battery,) + "%")
 
    # We have used PrettyTable to print the data on console.
    # t = PrettyTable()
    # t.add_row()
 
    # Fetch the Network information
    print("----Networks----")
    table = PrettyTable(['Network', 'Status', 'Speed'])
    for key in psutil.net_if_stats().keys():
        name = key
        up = "Up" if psutil.net_if_stats()[key].isup else "Down"
        speed = psutil.net_if_stats()[key].speed
        table.add_row([name, up, speed])
    print(table)
 
    # Fetch the memory information
    print("----Memory----")
    memory_table = PrettyTable(["Total", "Used",
                                "Available", "Percentage"])
    vm = psutil.virtual_memory()
    memory_table.add_row([
        vm.total,
        vm.used,
        vm.available,
        vm.percent
    ])
    print(memory_table)
     
 
    # Fetch the last 10 processes from available processes
    print("----Processes----")
    process_table = PrettyTable(['PID', 'PNAME', 'STATUS',
                                 'CPU', 'NUM THREADS'])
     
    for process in psutil.pids()[-10:]:
 
        # While fetching the processes, some of the subprocesses may exit
        # Hence we need to put this code in try-except block
        try:
            p = psutil.Process(process)
            process_table.add_row([
                str(process),
                p.name(),
                p.status(),
                str(p.cpu_percent())+"%",
                p.num_threads()
                ])
             
        except Exception as e:
            pass
    print(process_table)
 
    # Create a 1 second delay
    time.sleep(1)


输出: