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

如何在终端中覆盖打印内容实现动态加载进度更新?

实现终端覆盖式加载进度输出的方法

嘿,这个问题我太熟了!你遇到的是终端默认换行输出的问题——每次print(或类似输出命令)都会自动追加换行符\n,导致每次都是新行。要实现覆盖式更新,核心是利用终端的控制字符让光标回到行首,再清除旧内容后输出新内容,具体方法如下:

核心原理

  • 用回车符\r:它会把光标移到当前行的开头,但不会触发换行,这样新输出会从行首开始覆盖旧内容。
  • 配合ANSI控制码\033[K:用来清除从光标位置到行尾的所有内容,避免新内容长度比旧内容短时残留旧字符(比如旧内容是Loading assets - 10%,新内容是Done!,如果不清除的话会变成Done!ets - 10%)。

具体实现示例

1. Python 实现

两种常用方式,都能达到效果:

import time
import sys

# 方法一:使用 print 的 end 参数
print('Loading assets - 10%', end='\r')  # end='\r' 替换默认的换行符
time.sleep(1)  # 模拟加载耗时
# 先清除当前行,再输出新内容
print('\033[KLoading textures - 20%', end='\r')
time.sleep(1)
# 加载完成后记得换行,避免后续输出覆盖这行
print('\033[KLoading complete!')

# 方法二:使用 sys.stdout.write 更灵活
sys.stdout.write('Loading models - 30%')
sys.stdout.flush()  # 强制刷新输出缓冲区,避免内容滞留
time.sleep(1)
sys.stdout.write('\r\033[KLoading shaders - 40%')
sys.stdout.flush()
time.sleep(1)
print()  # 最后换行

2. Bash 脚本实现

# -n 表示不自动换行,-e 允许解析转义字符
echo -n "Loading assets - 10%"
sleep 1
# \r 回到行首,\033[K 清除行尾残留内容
echo -e "\r\033[KLoading textures - 20%"
sleep 1
echo -e "\r\033[KLoading complete!"
echo  # 最后换行

注意事项

  • 大部分现代终端(Linux/macOS Terminal、Windows Terminal、PowerShell)都支持ANSI控制码,旧版Windows CMD兼容性稍差,建议用Windows Terminal替代。
  • 输出后如果需要立即显示,记得刷新输出缓冲区(比如Python里的flush=True或sys.stdout.flush()),避免因为缓冲区缓存导致内容延迟显示。
  • 加载完成后一定要输出换行,否则后续的命令提示符会跟在加载行末尾,影响美观。

内容的提问来源于stack exchange,提问作者Basic and Default

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:47:47