跳转至

Python 彩色终端

简介

Python程序运行在终端上时,只有背景色和前景色2种颜色,通常是黑底白字

我们可以使用 rich 这个库,让 Python程序有更多的色彩和样式,视觉上更好看。

如果你是在Windows上运行程序,推荐使用 Windows terminal 终端软件, 而不是传统的 Console Host 。 因为前者对终端功能的支持更丰富。


安装 rich 库很简单, 执行 pip install rich 即可

进度条

rich支持彩色进度条。

如果,只有一个任务需要显示进度,可以使用快捷函数 track

比如,

import time
from rich.progress import track

for i in track(range(20), description="进度..."): 
    time.sleep(0.5) # 模拟执行任务耗费的时间


上面代码,for 循环每执行一次,进度条对应循环的完成次数

比如,上例中一共 循环 20次, 第1次循环完,进度条完成 1/20 第2次循环完,进度条完成 2/20 第3次循环完,进度条完成 3/20


sleep是模拟执行任务耗费的时间,真实有对应的任务,不需要sleep的。


下面是一个批量下载文件的代码示例

import urllib.request
from rich.progress import track

for i in track(range(5,16), description="进度..."):    
    url = f"https://mirrors.kernel.org/gnu/cpio/cpio-2.{i}.tar.gz"
    print(url)
    content = urllib.request.urlopen(url).read()
    with open(f'd:/tmp/3/cpio-2.{i}.tar.gz','wb') as f:
        f.write(content)


如果你不喜欢默认进度条色彩,可以给track函数 指定颜色参数,比如

track(range(5,16), description="进度...",
        complete_style="green", finished_style="green")

complete_style 和 finished_style 值分别指定了未完成和结束时的进度条前景色。可以指定一种颜色,支持256种单词表示颜色


如果你同时执行要显示多个任务的进度,需要多个进度条

import time
from rich.progress import Progress

with Progress() as progress:

    task1 = progress.add_task("[red]下载...", total=10)
    task2 = progress.add_task("[green]处理...", total=10)
    task3 = progress.add_task("[yellow]保存...", total=10)

    while not progress.finished:
        progress.update(task1, advance=0.5)
        progress.update(task2, advance=0.2)
        progress.update(task3, advance=1)
        time.sleep(1)


add_task 方法的 total指明了任务的总体进度值

update 方法 的 advance 参数 表示增加多少完成量,

也可以使用 completed 参数,表示目前该任务总共的完成量。这个值就是进度条已完成部分的长度。

比如

import time
from rich.progress import Progress

with Progress() as progress:

    task1 = progress.add_task("[red]下载...", total=10)
    task2 = progress.add_task("[green]处理...", total=10)
    task3 = progress.add_task("[yellow]保存...", total=10)

    t1 = 0
    while not progress.finished:
        t1 += 2
        progress.update(task1, completed=t1)
        progress.update(task2, advance=0.2)
        progress.update(task3, advance=1)
        time.sleep(1)