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

引言

在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.mfbz.cn/a/761159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git安装与使用及整合IDEA使用的详细教程

1. 版本控制软件介绍 版本控制软件提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,是支持软件公司的配置管理…

Swift 新结构化并发中鲜为人知的 isolated 参数

概述 伴随着 Swift 5.5(WWDC21)推出的新结构化并发到今年的 WWDC 24 已经有 3 个多年头了。想必大家都对其中 async/awiat、async let、TaskGroup、Actor 等各种概念都了然于胸了吧? 不过小伙伴们可能不知道的是:新结构化并发&a…

【Eplan】P8-图纸设计的四种方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 了解 EPLAN 的图纸设计的四种方法:面向图形、面向设备、面向物料清单、面向安装情况; 2、 问题场景 为什么 EPLAN 要使用四种不同的设计方法。 3、软硬件环境 1、软件版本:EPLAN…

Ubuntu无法安全地用该源进行更新,所以默认禁用该源。

解决方案 1. 获取并添加缺失的 GPG 公钥 可以使用 apt-key 命令来添加缺失的公钥。根据错误信息,缺失的公钥是 3B4FE6ACC0B21F32。 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F322. 更新软件包列表 添加公钥后,更…

ADS131A04硬件设计与软件调试

一、IC基本信息 ADS131A0x 双通道或四通道 24 位 128kSPS 同步采样 Δ-Σ ADC •双通道或四通道同步采样差分输入 • 数据速率:高达 128kSPS • 高性能: – 单通道精度:在 10,000:1 动态范围内优于 0.1% – 有效分辨率:20.6位…

【MotionCap】搭建wsl2的pytorch环境

参考大神:wsl2-ubuntu版本 cuda下周cuda11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sudo sh cuda_11.3.0_465.19.01_linux.run cuda是开源的么?下15分钟

重磅!云起无垠荣获“智能模糊测试赛道领航者”等多项殊荣

近日,以 “新质•真能力”(新质生产力,安全真能力)为主题的第四届数字安全大会正式召开。在此次大会上,数世咨询发布了《中国数字安全产业年度报告(2024)》、新质百强榜单以及国内首本《数字安全蓝皮书》。这些报告和榜…

操作系统精选题(四)(论述题)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀操作系统 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 一、银行家算法的一道例题 二、页…

【NOI】C++程序设计入门四

文章目录 前言一、浮点型(float和double)1.float类型2.double类型 二、保留小数的方法方法一:方法二: 三、样题讲解问题1:1603. 冷饮的价格?问题2:1957. 求三个数的平均数问题3:1602…

爬数据是什么意思?

爬数据的意思是:通过网络爬虫程序来获取需要的网站上的内容信息,比如文字、视频、图片等数据。网络爬虫(网页蜘蛛)是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。 学习一些爬数据的知识有什么用呢&#x…

(PC+WAP)高端大气的装修装潢公司网站模板

(PCWAP)高端大气的装修装潢公司网站模板PbootCMS内核开发的网站模板,该模板适用于装修公司网站、装潢公司网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;(PCWAP),同一个后台,数据即…

Vue2动态代理,换服务无须重启项目

1、痛点 当我们需要使用不同的服务器时,就需要手动修改vue.config.js中配置并重新启动项目。当项目越来越大时,会需要较长的时间来等待项目启动,如此反复,极大影响我们开发进度。 2、寻求解决方案 vue-cli 的代理是使用的http-p…

新勒索软件 Shinra 与 Limpopo 浮出水面

Shinra 勒索软件概览 Shinra 勒索软件的样本文件最早在 2024 年 4 月提交给公开的文件扫描服务。攻击者在部署和运行勒索软件前会先窃取受害者的数据,还会删除卷影副本以阻止数据恢复。 攻击者有时会使用亚文化的人物来进行命名,研究人员也怀疑 Shinra…

clion远程开发

clion远程开发 简要概括: 建立 SFTP 通讯,创建远程目录与本地目录的映射文件夹,就可以把本机文件夹中的文件用鼠标右键选中上全传,打开自动同步功能,后面更改文件就可以自动同步文件了。 一.新建SFTP远程链接服务 …

C++感受12-Hello Object 派生版

不变的功能,希望直接复用原有代码;变化的功能,希望在分开的代码里实现。 派生的基本概念和目的如何定义派生类以及创建派生对象派生对象的生死过程 0. 课堂视频 ff14-HelloObject-派生版 1. 派生的基本概念与目的 编程,或者说软…

无线领夹麦克风可以唱歌吗?推荐多款收音好的无线麦克风

如今是一个短视频营销飞速发展的时代,越来越多自媒体人通过短视频的方式来进行直播带货、生活Vlog、线上K歌等,记录下生活里那美丽的瞬间。不过也有不少新手视频创作者存在疑问:无线领夹麦克风可以唱歌吗? 答案是可以的&#xff0…

前端技术(二)——javasctipt 介绍

一、javascript基础 1. javascript简介 ⑴ javascript的起源 ⑵ javascript 简史 ⑶ javascript发展的时间线 ⑷ javascript的实现 ⑸ js第一个代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>…

SSM“点点通”餐饮点餐小程序-计算机毕业设计源码11264

摘要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;微信的餐饮点餐小程序更是深得消费者的喜爱&#xff0c;它的出现极大地改善了消费者的生活质量&#xff0c;同时&#xf…

电商价格监测:品牌控价维权的关键利器

品牌在进行控价时&#xff0c;所面对的是线上成千上万条的商品链接&#xff0c;如果仅依靠人工&#xff0c;根本无法做到准确且全面地完成电商价格监测工作。因此&#xff0c;一套准确率高的电商价格监测系统对于品牌的控价维权而言&#xff0c;其重要性不言而喻。 在形形色色的…

昇思25天学习打卡营第八天|保存与加载

背景 提供免费算力支持&#xff0c;有交流群有值班教师答疑的华为昇思训练营进入第八天了。 今天是第八天&#xff0c;前七天的学习内容可以看链接 昇思25天学习打卡营第一天|快速入门 昇思25天学习打卡营第二天|张量 Tensor 昇思25天学习打卡营第三天|数据集Dataset 昇思25天…