5、Python之rich:GUI之外,终端呈现也能玩出花

news2025/1/11 11:04:19

引言

在Python系列文章的上一篇中,我们从print的定义出发,进一步探索了print()函数更多的用法,尤其是一些哪怕是Python老手也可能忽略的用法。没有阅读的或者需要回顾print()及输出格式化的扩展用法,可以查看上一篇文章。
虽然print()函数基本能够满足日常的需要,但是,在涉及到一些更加灵活、美观的输出时,还是有些捉襟见肘。也许你不禁要问,终端呈现也就只能这样了吗?要更美观、灵活的输出,后面只能求助于Python的GUI编程了吗?
当然,GUI编程是一个很好的、很强大的手段,后面我们也会逐步涉及到。但是,终端的呈现其实不止于此,而且,考虑到实际很多Python的应用其实会部署在服务器端,能应用的有时可能只有终端。所以,接下来,我们步会通过Python的三方模块rich,进一步挖掘终端呈现的潜力。

准备工作

如同前面文章,我们已经学习使用过的三方模块Faker一样,rich也是一个三方模块。所以,在使用之前,也需要安装。

rich模块的安装

这里,我们同样使用最简单的pip来进行安装:

pip3 install rich

说明:不同的系统环境,可能是pip或者pip3。

源码及文档

感兴趣的,可以到github查看该模块的源码,尤其examples中提供了一些rich模块的使用实例,对我们学习使用该模块,很方便。

源码地址
https://github.com/Textualize/rich
相关官方学习文档
https://rich.readthedocs.io/en/latest/index.html

用rich武装终端

需要说明的是,由于是直接对应用的终端输出的能力的封装调用,所以,以下代码,如果是在PyCharm中直接运行输出,可能是看不到完整的输出效果的。所以,以下代码的执行,我们需要换一种方式,直接在系统的终端中执行:
打开系统的终端窗口,Windows的话,可以是CMD窗口,或者PowerShell;Mac系统的话,自带的终端,或者iTerm2,强烈推荐使用iTerm2,更加灵活好用。
在终端中切换到代码文件的存放路径,然后执行命令:

python3 ./rich_test.py

说明:假设我们要执行的代码脚本文件名为rich_test.py,不同系统环境中,可能是python,或者python3。

不同的print()输出

rich模块中提供了两种不同于Python内建的print()函数:

  • rich包下的print()函数,与Python内建的print()函数同名,支持富文本的输出
  • rich.pretty包下的pprint()函数,对集合数据结构进行格式化的输出,比如list,dict,set等
rich的print()函数

通过以下代码,进行富文本的终端输出:

from rich import print

# 由于直接导入了rich中print()函数,所以内建的print()函数被覆盖,以下直接调用print()函数,都是rich的print()函数
print("[italic red underline]Hello Python")

# 如果此时,想找到内建的print()函数,可以通过import builtins
import builtins

builtins.print("[italic red underline]Hello Python")

输出结果:


第一行为带样式的rich的print()函数的输出,这里指定了斜体、红色、加下划线的样式。更多样式的使用,可以参考官方使用文档。
第二行,则是通过内建的print()函数,输出相同的内容。

集合类型数据的格式化输出

下面的代码,演示了输出字典数据,以及一个列表的数据的输出:

from rich.pretty import pprint

# locals()函数是Python内建的一个函数,用于返回一个dict,包含当前上下文环境中的所有变量
pprint(locals())

names = ['张三', '李四', '王五']
pprint(names)
# expand_all参数,默认为Fase,以下演示为True的输出效果
pprint(names, expand_all=True)

输出结果:

Console的使用

如果涉及到更多场景的输出样式,我们需要使用rich.console包下的Console来实现。比如,输出的分区,富文本的显示,动态加载效果的呈现等

from rich.console import Console
import time

console = Console()
# 终端的输出进行分区,比如这是一条分割线
console.rule('这是一条分割线')
# 通过Console的print()函数输出富文本,文本样式通过style参数指定
console.print("注意!", style="italic red on white")
# 一个加载的loading演示,会动的小猴子
with console.status('working...', spinner='monkey'):
    time.sleep(20)

输出效果:

更多的spinner的效果,可以通过命令查看:

python3 -m rich.spinner

会显示每个spinner样式的名字,及对应的动态显示效果:

动态任务进度条的呈现

上面我们通过Console.status()方法实现了一个动态loading的效果,如果我们想跟进一步动态显示一个任务处理进度的进度条的效果,可以通过rich.progress包中的对应track()函数和Progress类来分别实现单任务进度条和多任务并行的进度条效果。

from rich.progress import track, Progress
import time

# 进度条
for i in track(range(20), description='Processing...'):
    time.sleep(0.1)

# 多任务并行处理
with Progress() as progress:
    task1 = progress.add_task('[red]Downloading...', total=100)
    task2 = progress.add_task('[green]Processing...', total=100)
    task3 = progress.add_task('[cyan]Cooking...', total=100)
    while not progress.finished:
        progress.update(task1, advance=0.5)
        progress.update(task2, advance=0.3)
        progress.update(task3, advance=0.8)
        time.sleep(0.1)

输出效果:

Python对象内容查看

在Python中,如果要查看一个对象中的内容,我们可以通过内建的dir()函数来查看,但是,查看的效果不是很直观。rich中提供了inspect()函数,能够更加直观得呈现:

dir()函数

首先看下通过dir()函数查看:

from rich.progress import Progress

# 通过内建的dir()函数查看对象
print(dir(Progress()))

输出结果:

inspect()函数

通过rich的inspect()函数查看相同的对象:

from rich import inspect
from rich.progress import Progress

# 通过内建的dir()函数查看对象
print(dir(Progress()))
# 通过rich的inspect()查看对象
inspect(Progress())
# 同时查看对象中的方法
inspect(Progress(), methods=True)

输出结果:

综合案例

rich模块中,还有终端树结构、表格的呈现方式。接下来,结合之前有提过的Faker模块生成测试数据、f-string格式化的用法,以及rich中的表格的使用,我们做一个动态表格,从而更加直观地查看测试数据的生成过程。同时,借助这个案例,学习rich中表格以及动态效果呈现的使用方法:

from rich.table import Table
from rich.live import Live
import time
from faker import Faker

fk = Faker('zh_CN')
# 1、定义一个表格对象
table = Table()

# 2、定义个Live()对象,动态呈现table对象的变化过程,设置每秒钟刷新5次
with Live(table, refresh_per_second=5):  # update 5 times per second
    # 在表格中添加4列
    table.add_column('用户ID')
    time.sleep(0.4)
    table.add_column('姓名')
    time.sleep(0.4)
    table.add_column('性别')
    time.sleep(0.4)
    table.add_column('年龄')
    # 3、通过Faker生成10条测试数据,并添加到table对象中进行呈现
    for row in range(10):
        time.sleep(0.4)
        table.add_row(f"{row + 1}", fk.name(), fk.passport_gender(), str(fk.random_int(18, 50)))


输出效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1879772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024/6/30周报

文章目录 摘要ABSTRACT文献阅读题目问题本文贡献方法LSTMTCN模型总体架构 实验实验结果 深度学习TCN-LSTM代码运行结果 总结 摘要 本周阅读了一篇关于TCN和LSTM进行光伏功率预测的文章,本文提出了一种利用LSTM-TCN预测光伏功率的新模型。它由长短期记忆和时间卷积网…

可编程定时计数器8253/8254 - 8253控制字

8253控制字 概述 图7-45中左下角的是控制字寄存器,其操作端口是0x43,它是8位大小的寄存器 控制字寄存器也称为模式控制器,在控制字寄存器中保存的内容称为控制字,控制字用来设置所指定的计数器(通道)的工作方式、读写格式及数制&#xff0c…

emptyDir + initContainer实现ConfigMap的动态更新(K8s相关)

1. 絮絮叨叨 K8s部署服务时,一般都需要使用ConfigMap定义一些配置文件例如,部署分布式SQL引擎Presto,会在ConfigMap中定义coordinator、worker所需的配置文件以node.properties为例,node.environment和node.data-dir的值将由Helm…

48 - 按日期分组销售产品(高频 SQL 50 题基础版)

48 - 按日期分组销售产品 -- group_concat 分组拼接selectsell_date,count(distinct product) num_sold,group_concat(distinct product order by product separator ,) products fromActivities group bysell_date;

监控电脑的软件有哪些?精选8大监控电脑的软件

根据当前市场反馈和功能评价,以下是八款备受推崇的电脑监控软件推荐,适合不同企业和组织的监控与管理需求: 1.安企神监控软件 特点:全面的局域网监控工具,擅长网络设备监控、网络性能管理和故障诊断。提供员工电脑屏幕…

C++操作系列(二):VSCode安装和配置C++开发环境

1. VSCode下载 进入VSCode的官网网页:Download Visual Studio Code - Mac, Linux, Windows 下载相应的版本: 2. 安装VSCode 安装到指定位置: 一路下一步,直至安装完成: 3. 安装C插件 3.1. 安装C/C 点击扩展图标&…

语音唤醒入门(基于ESP-skainet)

主要参考资料: ESP-SR 用户指南: https://docs.espressif.com/projects/esp-sr/zh_CN/latest/esp32s3/index.html 目录 ESP提供的模型直接初始化和使用模型AFE声学前端算法 使用模型 自定义模型 ESP提供的模型 乐鑫提供了经过训练的 WakeNet 和 MultiNet 模型&…

《高考择校择专业:权衡与抉择的智慧》

分数限制下,选好专业还是选好学校? 2024 年高考的大幕已然落下,然而对于众多考生而言,新的挑战才刚刚开始。在分数既定的情况下,是优先选择心仪的专业,还是更看重知名度高的学校?这无疑是一个令…

Go线程实现模型-核心元素的容器

核心元素的容器 图例 作用 3个全局容器存在的主要目的,都是为了罗列某个核心元素的全部 与G相关的调度器 与G相关的那4个非全局容器:调度器的可运行G队列、调度器的自由G队列、本地P的可运行G队列,以及本地P的自由G列表 全局G列表 任何…

LLM 大模型入门笔记-Tokenizer

下图展示了完整的 tokenization 流程,接下来会对每个步骤做进一步的介绍。 tokenizer_pipeline 1. Normalization normalize 其实就是根据不同的需要对文本数据做一下清洗工作,以英文文本为例可以包括删除不必要的空白、小写和/或删除重音符号。 代码…

《概率论与数理统计》期末复习笔记_下

目录 第4章 随机变量的数字特征 4.1 数学期望 4.2 方差 4.3 常见分布的期望与方差 4.4 协方差与相关系教 第5章 大数定律和中心极限定理 5.1 大数定律 5.2 中心极限定理 第6章 样本与抽样分布 6.1 数理统汁的基本概念 6.2 抽样分布 6.2.1 卡方分布 6.2.2 t分布 6.…

Winform使用HttpClient调用WebApi的基本用法

Winform程序调用WebApi的方式有很多,本文学习并记录采用HttpClient调用基于GET、POST请求的WebApi的基本方式。WebApi使用之前编写的检索环境检测数据的接口,如下图所示。 调用基于GET请求的无参数WebApi 创建HttpClient实例后调用GetStringAsync函数获…

数学之美:SQL语句的编译与关系代数

引言 当年读书的时候,真正学到数据库的操作之前,先学的内容是关系代数运算,以及相关的关系代数的定律。然后知道了当前比较主流的数据库都是关系型数据库,其底层依赖的是关系代数。 但是,当年考试的时候,…

【C语言】C语言-体育彩票的模拟生成和兑奖(源码+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

研导智能科技——AI辅助科研产品开发

人工智能(AI)技术的飞速发展为科研领域带来了革命性的变化。本公司致力于开发基于人工智能的科研辅助产品,旨在通过智能化手段提高科研人员的工作效率和研究质量。目前,我们成功开发了研导学术平台(www.zhiyanxueshu.c…

Clickhouse启动失败定位

Clickhouse启动失败定位 1. 定位问题 查看状态 systemctl status clickhouse-server2. 查看日志 在这里插入代码片3. 发现是磁盘不够,进一步查看磁盘信息 df -h 目录4. 查看目录存储信息 du -h --max-depth1 /data/clickhouse5. 进行磁盘清理

VMware每次打开网络设置都出现需要运行NetworkManager问题

每次打开都出现这个情况,是因为之前把NetworkManager服务服务关闭,重新输入命令: sudo systemctl start NetworkManager.service或者 sudo service network-manager restart 即可解决,但是每次开机重启都要打开就很麻烦&#xf…

Webpack: 构建 NPM Library

概述 虽然 Webpack 多数情况下被用于构建 Web 应用,但与 Rollup、Snowpack 等工具类似,Webpack 同样具有完备的构建 NPM 库的能力。与一般场景相比,构建 NPM 库时需要注意: 正确导出模块内容;不要将第三方包打包进产…

面了英伟达算法岗,被疯狂拷打。。。

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句,从而获取、修改或删除数据库中的数据。 具体细节如下: 攻击向量&…