You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现多行CPU使用率数据在控制台固定位置刷新显示?

问题

我正在编写Python程序,通过PSUtil获取并解析各核心的CPU使用率并展示给用户。当前代码运行时会不断追加新的输出行,而我希望在控制台同一位置刷新替换原有数据,同时保留每行的换行格式。

当前代码

import psutil
import time

def getAllCoreData_Parsed():
    output = ""

    for count, cpu in enumerate(psutil.cpu_percent(percpu=True)):
        output += f"Core {count:<2}\t{cpu:>5}%\033[0;37;48m\n"

    return output

while True:
   print(
        getAllCoreData_Parsed(),
        end="\r"
    )

    time.sleep(1)

    print(
        "\x1b[K",
        end="\r"
    )

当前现象

输出会不断追加新的CPU数据行,示例如下:

Core 0    0.0%
Core 1    0.0%
...
Core 11   0.0%
Core 0    5.0%
Core 1    0.6%
...
Core 11   0.0%

期望效果

在控制台同一位置刷新替换原有数据,每次只显示最新的各核心CPU使用率,示例如下:

Core 0    1.0%
...
Core 11   0.0%

(刷新后同一位置)

Core 0    12.0%
...
Core 11   0.0%
解决方案

要实现控制台同一位置刷新多行数据,核心是用ANSI控制码将光标移回数据起始位置,让新输出覆盖旧内容。修改后的代码如下:

import psutil
import time

def getAllCoreData_Parsed():
    output = ""
    # 先调用一次避免首次返回0(psutil特性)
    psutil.cpu_percent(percpu=True)
    time.sleep(0.1)
    cpu_data_list = psutil.cpu_percent(percpu=True)
    core_count = len(cpu_data_list)
    for count, cpu in enumerate(cpu_data_list):
        output += f"Core {count:<2}\t{cpu:>5}%\n"
    return output, core_count

while True:
    cpu_output, core_num = getAllCoreData_Parsed()
    print(cpu_output, end="")
    # ANSI控制码:光标向上移动core_num行,回到输出起始位置
    print(f"\x1b[{core_num}A", end="")
    time.sleep(1)

代码说明

  1. 修正psutil首次调用问题:psutil.cpu_percent(percpu=True)第一次调用会返回0值,所以先调用一次并短暂休眠,确保后续拿到真实的CPU使用率。
  2. 光标回移控制:\x1b[{core_num}A 是ANSI终端控制码,能让光标向上移动对应核心数的行数,回到输出内容的开头,下次打印就会直接覆盖旧数据。
  3. 简化冗余控制码:原代码里的\033[0;37;48m是默认前景色设置,无实际作用,直接移除。

如果你的终端不支持ANSI控制码(比如Windows原生CMD),可以改用清屏方式实现:

import psutil
import time
import os

def getAllCoreData_Parsed():
    output = ""
    psutil.cpu_percent(percpu=True)
    time.sleep(0.1)
    for count, cpu in enumerate(psutil.cpu_percent(percpu=True)):
        output += f"Core {count:<2}\t{cpu:>5}%\n"
    return output

while True:
    os.system('cls')  # Linux/macOS替换成'clear'
    print(getAllCoreData_Parsed())
    time.sleep(1)

内容的提问来源于stack exchange,提问作者Bingus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:52:53