翼度科技»论坛 编程开发 python 查看内容

Python Rich:美化终端显示效果

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
Rich库的功能就像它的名字一样,使Python编程更加丰富(rich),
它帮助开发者在控制台(命令行)输出中创建丰富、多彩和具有格式化的文本。
本篇总结了如何使用Rich库让我们的命令行工具更加美观。
1. 安装

通过pip安装:
  1. pip install rich
复制代码
使用下面的命令验证是否安装成功。
  1. python -m rich
复制代码
2. 应用示例

Rich的功能很多,下面通过代码示例来演示其中主要的功能。
2.1. 美化 REPL 输出

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

注:REPL全称: Read-Eval-Print-Loop (交互式解释器)
默认的REPL是没有颜色的,使用Rich可以美化REPL的显示,获得更好的交互效果。
只需要导入Rich库的pretty即可。
  1. >>> from rich import pretty
  2. >>> pretty.install()
复制代码
再次运行上面的代码:

不同的数据类型会用不同的颜色来表示。
2.2. 查看对象信息

Rich库中还提供了一个还有用的功能,用来查看python中各个变量或对象的详细信息。
使用前导入 inspect 函数。
  1. >>> from rich import inspect
复制代码
对于变量,查看其概括信息的方式如下:
  1. >>> inspect(lst_var)
复制代码

查看其包含的方法:
  1. >>> inspect(lst_var, methods=True)
复制代码

对于对象,也是一样:
  1. # -*- coding: utf-8 -*-
  2. from rich import inspect
  3. class Sample:
  4.     def __init__(self, name, age):
  5.         self._name = name
  6.         self._age = age
  7.     def info(self):
  8.         print("姓名: {}, 年龄: {}".format(self.name, self.age))
  9.     def set(self, name, age):
  10.         self.name = name
  11.         self.age = age
  12.     def get(self):
  13.         return {"name": self.name, "age": self.age}
  14.     # 私有函数
  15.     def _private(self):
  16.         print("这是私有函数")
  17. if __name__ == "__main__":
  18.     sa = Sample("harry", 33)
  19.     # 显示对象概要信息
  20.     inspect(sa)
  21.     # 显示对象方法信息
  22.     inspect(sa, methods=True)
  23.     # 显示对象方法和私有变量,私有函数
  24.     inspect(sa, methods=True, private=True)
复制代码

Rich库的inspect函数让我们在命令行中也可以获得非常好的阅读体验。
2.3. 动态显示内容

动态显示在命令行中一直是个难点,而Rich库能帮助我们很容易的实现状态和进度的动态显示。
比如,如果有多个任务在执行,可以用Rich来动态显示执行的情况。
  1. # -*- coding: utf-8 -*-
  2. from time import sleep
  3. from rich.console import Console
  4. console = Console()
  5. count = 5
  6. tasks = [f"task {n}" for n in range(1, count + 1)]
  7. with console.status("") as status:
  8.     num = 1
  9.     while tasks:
  10.         status.update("[{}/{}] 已经完成".format(num, count))
  11.         task = tasks.pop(0)
  12.         sleep(1)
  13.         num += 1
  14. print("所有任务 全部完成!")
复制代码

这样就不用打印出很多行的日志信息,而是动态的显示task完成的情况。
还有一个动态的应用是进度条,进度条虽然不能提高程序的性能,
但是它让我们了解到程序大概运行到哪了,能够减少等待的焦虑。
比如,传输大量文件或者下载大文件的过程中,没有进度条的话,常常会担心程序是不是卡住了。
下面是一个模拟文件传输中使用进度条的示例:
  1. # -*- coding: utf-8 -*-
  2. import time
  3. from rich.progress import Progress
  4. # 模拟2个文件,一个是文件名,一个是文件大小
  5. files = [("windows.iso", 24000), ("debian.iso", 17000)]
  6. with Progress() as progress:
  7.     tasks = []
  8.     for f in files:
  9.         task_id = progress.add_task("copy {}".format(f[0]), filename=f[0], start=False)
  10.         progress.update(task_id, total=f[1])
  11.         progress.start_task(task_id)
  12.         # 模拟读取文件,每次读取1024字节
  13.         total = f[1]
  14.         buffer = 1024
  15.         while total > 0:
  16.             read_bytes = 0
  17.             if total > buffer:
  18.                 read_bytes = buffer
  19.                 total -= buffer
  20.             else:
  21.                 read_bytes = total
  22.                 total = 0
  23.             progress.update(task_id, advance=read_bytes)
  24.             time.sleep(0.2)
  25.         progress.console.log("{} 传输完成!".format(f[0]))
  26.         progress.stop_task(task_id)
复制代码

2.4. 复杂结构显示

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

表格是最常用的一种表现形式,也是最常用的一种展示数据的方式。
  1. # -*- coding: utf-8 -*-
  2. from rich.console import Console
  3. from rich.table import Table
  4. table = Table(title="国内生产总值指数")
  5. table.add_column("年份", justify="left", , no_wrap=True)
  6. table.add_column("指标", )
  7. table.add_column("数值", justify="right", )
  8. table.add_row("2022年", "国民总收入指数", "4432.1")
  9. table.add_row("2021年", "国民总收入指数", "4319.7")
  10. table.add_row("2020年", "国民总收入指数", "3979.1")
  11. table.add_row("2019年", "国民总收入指数", "3912.1")
  12. console = Console()
  13. console.print(table)
复制代码

2.4.2. 树形

树形结构也是常用的结构,比如展示文件夹结构:
  1. # -*- coding: utf-8 -*-
  2. from rich.tree import Tree
  3. from rich import print
  4. # 根节点
  5. tree = Tree("/")
  6. # usr 分支
  7. usr = tree.add("usr")
  8. fonts = usr.add("fonts")
  9. bin = usr.add("bin")
  10. lib = usr.add("lib")
  11. # home 分支
  12. home = tree.add("home")
  13. git = home.add("git")
  14. python = home.add("python")
  15. golang = home.add("golang")
  16. # projects 分支
  17. projects = home.add("projects")
  18. samples = projects.add("samples")
  19. work = projects.add("work")
  20. print(tree)
复制代码

2.5. 文档和代码显示

在IT行业内,markdown文档代码几乎是绕不开的2个东西。
然而,直接在命令行中原样显示的markdown代码的话,是很难阅读的。
利用Rich库,可以帮助我们解析markdown的标记,高亮不同编程语言的代码,从而在命令行中获得良好的阅读体验。
  1. # -*- coding: utf-8 -*-
  2. from rich.console import Console
  3. from rich.markdown import Markdown
  4. md_sample = """这是一份[Markdown][1]的语法介绍。
  5. # 段落
  6. 一个段落是由一个或多个连续的行构成,段落间靠一个或以上视觉上的空行划分。
  7.     这是一个段落。它有两个句子。
  8.     这是另一个段落。它也有
  9.     两个句子。
  10. ## 代码
  11. `print("hello")`
  12. ### 列表
  13. * 无序(没有编号的)列表中的一项
  14.     * 一个子项,要以一个制表符或者4个空格缩进
  15. * 无序列表中的另一个项
  16. 1. 有序(排好序,有编号的)列表中的一项
  17. 1. 有序列表中的另一个项
  18. [1]: http://daringfireball.net/projects/markdown/
  19. """
  20. console = Console()
  21. markdown = Markdown(md_sample)
  22. console.print(markdown)
复制代码

可以看出,不同的markdown标记会解析成不同的显示效果。
同样,对于不同的代码,也可以高亮显示:
  1. # -*- coding: utf-8 -*-
  2. from rich.console import Console
  3. from rich.syntax import Syntax
  4. py_code = """
  5. def hello(name):
  6.     print("hello ", name)
  7. hello("world")
  8. """
  9. java_code = """
  10. public class HelloWorld
  11. {
  12.     public static void main(String[] args)
  13.     {
  14.         System.out.println("Hello,World!");
  15.     }
  16. }
  17. """
  18. c_code = """
  19. #include <stdio.h>
  20. int main()
  21. {
  22.     printf("Hello,World!");
  23.     return 1;
  24. }
  25. """
  26. console = Console()
  27. console.print("========================")
  28. console.print("[green]python 代码")
  29. console.print("========================")
  30. syntax = Syntax(py_code, "python", theme="monokai", line_numbers=True)
  31. console.print(syntax)
  32. console.print("========================")
  33. console.print("[blue]java 代码")
  34. console.print("========================")
  35. syntax = Syntax(java_code, "java", theme="monokai", line_numbers=True)
  36. console.print(syntax)
  37. console.print("========================")
  38. console.print("[red]c 代码")
  39. console.print("========================")
  40. syntax = Syntax(c_code, "c", theme="monokai", line_numbers=True)
  41. console.print(syntax)
复制代码

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

总的来说,Python Rich库是一个强大的工具,可以让Python开发者在命令行环境中拥有更加丰富和强大的输出能力,使得数据呈现更加直观,增强了代码的可读性和调试效率。
本篇演示了一些常用的功能,关于Rich库的其他功能和每个功能的细节可以参考其官方文档:
https://rich.readthedocs.io/en/latest/

来源:https://www.cnblogs.com/wang_yb/p/18013971
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具