首页 > 编程语言 >Python Rich:美化终端显示效果

Python Rich:美化终端显示效果

时间:2024-02-12 16:55:06浏览次数:32  
标签:console rich Python add Rich print import 美化

Rich库的功能就像它的名字一样,使Python编程更加丰富(rich),
它帮助开发者在控制台(命令行)输出中创建丰富、多彩和具有格式化的文本。

本篇总结了如何使用Rich库让我们的命令行工具更加美观。

1. 安装

通过pip安装:

pip install rich

使用下面的命令验证是否安装成功。

python -m rich

2. 应用示例

Rich的功能很多,下面通过代码示例来演示其中主要的功能。

2.1. 美化 REPL 输出

安装python之后,在命令行输入python,就可以进入python的交互式命令行环境(REPL)。
因为python是解释性语言,所以可以在REPL环境中交互式的运行代码:
image.png
注:REPL全称: Read-Eval-Print-Loop (交互式解释器)

默认的REPL是没有颜色的,使用Rich可以美化REPL的显示,获得更好的交互效果。
只需要导入Rich库的pretty即可。

>>> from rich import pretty
>>> pretty.install()

再次运行上面的代码:
image.png
不同的数据类型会用不同的颜色来表示。

2.2. 查看对象信息

Rich库中还提供了一个还有用的功能,用来查看python中各个变量或对象的详细信息。
使用前导入 inspect 函数。

>>> from rich import inspect

对于变量,查看其概括信息的方式如下:

>>> inspect(lst_var)

image.png

查看其包含的方法:

>>> inspect(lst_var, methods=True)

image.png

对于对象,也是一样:

# -*- coding: utf-8 -*-
from rich import inspect

class Sample:
    def __init__(self, name, age):
        self._name = name
        self._age = age

    def info(self):
        print("姓名: {}, 年龄: {}".format(self.name, self.age))

    def set(self, name, age):
        self.name = name
        self.age = age

    def get(self):
        return {"name": self.name, "age": self.age}

    # 私有函数
    def _private(self):
        print("这是私有函数")

if __name__ == "__main__":
    sa = Sample("harry", 33)

    # 显示对象概要信息
    inspect(sa)

    # 显示对象方法信息
    inspect(sa, methods=True)

    # 显示对象方法和私有变量,私有函数
    inspect(sa, methods=True, private=True)

image.png
Rich库的inspect函数让我们在命令行中也可以获得非常好的阅读体验。

2.3. 动态显示内容

动态显示在命令行中一直是个难点,而Rich库能帮助我们很容易的实现状态和进度的动态显示。

比如,如果有多个任务在执行,可以用Rich来动态显示执行的情况。

# -*- coding: utf-8 -*-

from time import sleep
from rich.console import Console

console = Console()
count = 5
tasks = [f"task {n}" for n in range(1, count + 1)]


with console.status("") as status:
    num = 1
    while tasks:
        status.update("[{}/{}] 已经完成".format(num, count))
        task = tasks.pop(0)
        sleep(1)
        num += 1

print("所有任务 全部完成!")

rich-status.gif
这样就不用打印出很多行的日志信息,而是动态的显示task完成的情况。

还有一个动态的应用是进度条,进度条虽然不能提高程序的性能,
但是它让我们了解到程序大概运行到哪了,能够减少等待的焦虑。

比如,传输大量文件或者下载大文件的过程中,没有进度条的话,常常会担心程序是不是卡住了。
下面是一个模拟文件传输中使用进度条的示例:

# -*- coding: utf-8 -*-

import time

from rich.progress import Progress

# 模拟2个文件,一个是文件名,一个是文件大小
files = [("windows.iso", 24000), ("debian.iso", 17000)]

with Progress() as progress:
    tasks = []
    for f in files:
        task_id = progress.add_task("copy {}".format(f[0]), filename=f[0], start=False)
        progress.update(task_id, total=f[1])

        progress.start_task(task_id)
        # 模拟读取文件,每次读取1024字节
        total = f[1]
        buffer = 1024
        while total > 0:
            read_bytes = 0
            if total > buffer:
                read_bytes = buffer
                total -= buffer
            else:
                read_bytes = total
                total = 0

            progress.update(task_id, advance=read_bytes)
            time.sleep(0.2)

        progress.console.log("{} 传输完成!".format(f[0]))
        progress.stop_task(task_id)

rich-progress.gif

2.4. 复杂结构显示

Rich库还可以帮助我们在控制台显示一些结构化的内容。

2.4.1. 表格

表格是最常用的一种表现形式,也是最常用的一种展示数据的方式。

# -*- coding: utf-8 -*-

from rich.console import Console
from rich.table import Table

table = Table(title="国内生产总值指数")

table.add_column("年份", justify="left", style="cyan", no_wrap=True)
table.add_column("指标", style="magenta")
table.add_column("数值", justify="right", style="green")

table.add_row("2022年", "国民总收入指数", "4432.1")
table.add_row("2021年", "国民总收入指数", "4319.7")
table.add_row("2020年", "国民总收入指数", "3979.1")
table.add_row("2019年", "国民总收入指数", "3912.1")

console = Console()
console.print(table)

image.png

2.4.2. 树形

树形结构也是常用的结构,比如展示文件夹结构:

# -*- coding: utf-8 -*-

from rich.tree import Tree
from rich import print

# 根节点
tree = Tree("/")

# usr 分支
usr = tree.add("usr")
fonts = usr.add("fonts")
bin = usr.add("bin")
lib = usr.add("lib")

# home 分支
home = tree.add("home")
git = home.add("git")
python = home.add("python")
golang = home.add("golang")

# projects 分支
projects = home.add("projects")
samples = projects.add("samples")
work = projects.add("work")

print(tree)

image.png

2.5. 文档和代码显示

IT行业内,markdown文档代码几乎是绕不开的2个东西。

然而,直接在命令行中原样显示的markdown代码的话,是很难阅读的。
利用Rich库,可以帮助我们解析markdown的标记,高亮不同编程语言的代码,从而在命令行中获得良好的阅读体验。

# -*- coding: utf-8 -*-

from rich.console import Console
from rich.markdown import Markdown


md_sample = """这是一份[Markdown][1]的语法介绍。

# 段落

一个段落是由一个或多个连续的行构成,段落间靠一个或以上视觉上的空行划分。

    这是一个段落。它有两个句子。

    这是另一个段落。它也有
    两个句子。


## 代码

`print("hello")`

### 列表

* 无序(没有编号的)列表中的一项
    * 一个子项,要以一个制表符或者4个空格缩进
* 无序列表中的另一个项
1. 有序(排好序,有编号的)列表中的一项
1. 有序列表中的另一个项


[1]: http://daringfireball.net/projects/markdown/
"""

console = Console()
markdown = Markdown(md_sample)
console.print(markdown)

image.png
可以看出,不同的markdown标记会解析成不同的显示效果。

同样,对于不同的代码,也可以高亮显示:

# -*- coding: utf-8 -*-

from rich.console import Console
from rich.syntax import Syntax

py_code = """
def hello(name):
    print("hello ", name)

hello("world")
"""

java_code = """
public class HelloWorld
{
    public static void main(String[] args)
    {
        System.out.println("Hello,World!");
    }
}
"""

c_code = """
#include <stdio.h>
int main()
{
    printf("Hello,World!");
    return 1;
}
"""

console = Console()

console.print("========================")
console.print("[green]python 代码")
console.print("========================")
syntax = Syntax(py_code, "python", theme="monokai", line_numbers=True)
console.print(syntax)

console.print("========================")
console.print("[blue]java 代码")
console.print("========================")
syntax = Syntax(java_code, "java", theme="monokai", line_numbers=True)
console.print(syntax)

console.print("========================")
console.print("[red]c 代码")
console.print("========================")
syntax = Syntax(c_code, "c", theme="monokai", line_numbers=True)
console.print(syntax)

image.png
这里只演示了3种代码,但是Rich可以支持几乎所有主流的代码。

3. 总结

总的来说,Python Rich库是一个强大的工具,可以让Python开发者在命令行环境中拥有更加丰富和强大的输出能力,使得数据呈现更加直观,增强了代码的可读性和调试效率。

本篇演示了一些常用的功能,关于Rich库的其他功能和每个功能的细节可以参考其官方文档:
https://rich.readthedocs.io/en/latest/

标签:console,rich,Python,add,Rich,print,import,美化
From: https://www.cnblogs.com/wang_yb/p/18013971

相关文章

  • Python 机器学习 线性回归和岭回归
    ​ Python机器学习中,机器学习领域的线性回归和岭回归是两种常用的回归分析方法,用于预测一个或多个自变量(或称为特征)和因变量(或称为目标变量)之间的关系。这两种方法都试图找到最佳的线性组合来预测目标变量,但它们在处理数据的方法上有所不同。线性回归和岭回归都是常用的线性回......
  • python3.9 + django4.1 + vue3 ,报错,无法访问配置的路由地址,Using the URLconf defined
    python3.9+django4.1+vue3,报错,无法访问配置的路由地址,UsingtheURLconfdefinedinStudentMgrBE.urls,DjangotriedtheseURLpatterns,inthisorder:-------------------------------------------------------------------------------无法访问 地址,报错如下: Us......
  • Python 机器学习 线性回归 梯度下降法优化损失函数
    ​ Python机器学习中,梯度下降法是一种用于优化线性回归模型(以及其他机器学习算法)的损失函数的通用算法。目的是通过迭代地调整模型的参数(权重和截距),以最小化损失函数,例如均方误差(MSE)。梯度下降的基本思想是计算损失函数相对于每个参数的梯度(即偏导数),然后朝着减少损失的方向调......
  • 匀加速运动模拟python,(matplotlib)
    importnumpyasnpimportmatplotlibmatplotlib.use("TKAgg")importmatplotlib.pyplotaspltg=9.8s=100ds=0.00001#单位米v0=0.001#m/sv=[v0]t=[ds/v0]t_sum=0ds_num=int(s/ds)x=[]y=[]foriinrange(ds_num+1):ifi==0:continue......
  • Python通过Lxml库解析网络爬虫抓取到的html
    ​Lxml是基于libxml2解析库的Python封装。libxml2是使用C语言编写的,解析速度很好,不过安装起来稍微有点复杂。安装说明可以参考(http://Lxml.de/installation.html),在CentOS7上中文安装说明(http://www.cjavapy.com/article/64/),使用lxml库来解析网络爬虫抓取到的HTML是一种非常......
  • python基础学习4
    异常处理try-excepttry-except-excepttry-except-except-elsetry-except-except-else-finally:raise关键字raiseException('自定义异常')异常类型ZeroDivisionError除数为零IndexError索引超出范围KeyError字典取值时key不存在NameError使用未声明变量Sy......
  • 八、Python开发环境管理
    AnacondaAnaconda介绍、安装及使用教程-知乎(zhihu.com)如果你已经安装了Anaconda,那么就不再需要再安装Python了。Anaconda是一个集成了Python和大量常用Python库的发行版,它内置了Python环境和多种常用的Python库,可以直接使用。安装Anaconda后,你就可以在命令......
  • Python--变量和简单数据类型
    Python--变量和简单数据类型变量的命名和使用1.变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message。1_message="helloworld"#错误写法message_1="helloworld"#正确写法2.变量名不能......
  • 第 7章 Python 爬虫框架 Scrapy(上)
    第7章Python爬虫框架Scrapy(上)编写爬虫可以看成行军打仗,基本的角色有两个:士兵和将军,士兵冲锋陷阵,而将军更多地是调兵遣将。框架就像一个将军,里面包含了爬虫的全部流程、异常处理和任务调度等。除了可以让我们少写一些烦琐的代码,学习框架还可以学到编程思想和提升编程能力。Pyt......
  • python3创建虚拟环境
    在Python3中创建虚拟环境,你可以使用venv模块。venv模块是Python3.3及更高版本中自带的,用于创建独立的Python环境。以下是创建虚拟环境的步骤:打开终端或命令提示符。导航到你想要创建虚拟环境的目录。运行以下命令创建虚拟环境:python3-mvenvmyenv这将创建一个名为myen......