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

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

1. 安装

通过pip安装:

pip install rich

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

python -m rich

2. 应用示例

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

2.1. 美化 REPL 输出

安装python之后,在命令行输入python,就可以进入python的交互式命令行环境(REPL)。
因为python是解释性语言,所以可以在REPL环境中交互式的运行代码:

注:REPL全称: Read-Eval-Print-Loop (交互式解释器)

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

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

再次运行上面的代码:

不同的数据类型会用不同的颜色来表示。

2.2. 查看对象信息

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

>>> from rich import inspect

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

>>> inspect(lst_var)

查看其包含的方法:

>>> inspect(lst_var, methods=True)

对于对象,也是一样:

# -*- 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)


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("所有任务 全部完成!")


这样就不用打印出很多行的日志信息,而是动态的显示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)

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)

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)

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)


可以看出,不同的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)


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

3. 总结

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

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

Python Rich:美化终端显示效果的更多相关文章

  1. “jupyter notebook 不能导入python库但是终端上可以实现”的问题的解决

    在使用jupyter notebook的过程中,创建了一个新的环境(anaconda中env)后遇到了这样一个问题,就是: 在jupyter notebook上运行程序,中间发现有一个python库未 ...

  2. 切换Python环境 linux终端命令行

    切换Python环境 conda info -e // 查看有什么环境 source activate env //切换环境 linux终端分屏 terminator  https://www.jia ...

  3. Python rich comparisons 自定义对象比较过程和返回值

    Classes wishing to support the rich comparison mechanisms must add one or more of the following new ...

  4. Linux美化终端

    终端美化 不管你是Kali 还是 Centos  还是Ubuntu... 请先用你的安装器安装 zsh 这里以Ubuntu 为例: 终端美化使用的on-my-zsh 首先先介绍一下什么是zsh,zsh ...

  5. Windows 重装系统,配置 WSL,美化终端,部署 WebDAV 服务器,并备份系统分区

    最新博客文章链接 最近发现我 Windows11 上的 WSL 打不开了,一直提示我虚拟化功能没有打开,但我看了下配置,发现虚拟化功能其实是开着的.然后试了各种方法,重装了好几次系统,我一个软件一个软 ...

  6. archlinux 源配置 桌面美化 终端美化 常用软件 grub配置

    简介 本文讲对archlinux进行一些基础系统的配置.常用安装的安装,美化进行配置,先看一下美化后的效果吧 配置pacman和使用AUR(archlinuxcn源) archlinux采用滚动更新的 ...

  7. Linux美化——终端提示符

    1. PS1变量简介[1] PS1是Linux终端用户的一个环境变量,用来说明命令行提示符的设置. 可以使用 man bash命令查看bash手册,找到该变量支持的特殊字符,以及这些特殊字符的意义: ...

  8. python运行windows终端程序

    其实是用python控制windows里的shell 1.windows有PowerShell,可以通过搜索打开,运行python不需要打开shell 2.用python里的subprocess函数, ...

  9. python print 美化

    本来是按照百度搜到的教程来为print输出添加颜色 然后bing了下,已经有封装好的包了,就是python-blessings 效果如图 API网址:https://blessings.readthe ...

  10. python常用命令—终端安装win32的两种方法

    1, pip install pywin32 2, pip install pypiwin32

随机推荐

  1. shell脚本(9)-流程控制for

    一.循环介绍 for循环叫做条件循环,或者for i in,可以通过for实现流程控制 二.for语法 1.for语法一:for in for var in value1 value2 ...... ...

  2. 问题--在C++使用strcpy等函数时发生C4996报错

    1.问题如下: C4996:'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To ...

  3. 有n个整数,使前面各数顺序向后m个位置,最后m个数变成最前面m个数,见图 8.43。写一函数实现以上功能在主函数中输入个整数和输出调整后的n个数。

    4,有n个整数,使前面各数顺序向后m个位置,最后m个数变成最前面m个数,见图 8.43.写一函数实现以上功能在主函数中输入个整数和输出调整后的n个数. 我的代码: 1.使用双向链表 void Move ...

  4. DEV-C++调试报错

    1.报错信息如下: 2.原因 SIGSEGV是是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号. 意思是程序接受一个无效的指针地址,Segmentation fault即是提示我们去 ...

  5. Linux-用户管理-useradd-userdel-id

  6. 海思Hi35xx 通过uboot查看flash指定地址的数据

    ​ 前言 在实际应用中有遇到过设备放置一段时间后设备不能启动的问题,uboot 完全没有响应,类似于flash中的数据被擦洗掉一样. 网上有介绍说是nandflash 不稳定,高温或是静电会导致nan ...

  7. Linux 处理CPU和内存参数的方式总结

    Linux 处理CPU和内存参数的方式总结 关闭NUMA,关闭透明大页 比较简单的方法: vim /etc/default/grub 在 GRUB_CMDLINE_LINUX 里面添加配置: tran ...

  8. Nginx调优总结-第六部分编译优化与简单测试

    第六部分 编译优化 Nginx可以自行编译,所以里面可以设置多个编译策略. 也可以自行修改源码,便于比如进行ip_hash的全IP地址验证. 也可以修改nginx的版本号等信息, 避免内发现. 还可以 ...

  9. 【我在京东做研发】揭秘支撑京东万人规模技术人员协作的行云DevOps平台

    分享人:孙长虹 京东云DevOps解决方案架构师 复旦大学计算机系毕业,并拥有人民大学心理学硕士学位.曾任职于Alcatel-Lucent,IBM和惠普,具有丰富的大型复杂产品研发及项目管理经验,擅长 ...

  10. Spring Boot日志框架Slf4j+logback

    一.简介 Slf4j Java的简单日志记录外观(Simple Logging Facade for Java )可作为各种日志记录框架(例如java.util.logging,logback,log ...