在Python中安装和使用Rich包
在这篇文章中,我们将学习如何在 Python 中安装和使用rich的软件包.
RIch是一个用于创建一些很棒的终端格式化和日志的python包。它有几个特点和功能,可以使你的应用程序看起来更漂亮,甚至为你的CLI应用程序添加一个新的外观。在这篇文章中,我们将了解Python中RICH包的安装过程和基本用法.
安装Rich 包
Rich是一个python包,所以我们可以用pip命令来安装它,你可以直接用pip安装命令来安装Rich,但如果你不想把你的全局python环境搞乱,你可以用virtualenv来单独尝试和玩一个包。因此,我们将首先用virtuelenv包建立一个虚拟环境.
搭建虚拟环境
要建立一个虚拟环境,请参考文章:使用venv创建虚拟环境。
要建立一个新的虚拟环境,你需要virtualenv包,所以用下面的命令全局安装该virtualenv包 :
pip install virtualenv
这将在全局python环境中安装virtualenv,所以我们现在可以在系统的任何地方创建一个虚拟环境。为了创建一个虚拟环境,我们将使用virtualenv命令,后面加上虚拟环境的名字。选择一个系统中的理想位置,下面的命令将在当前位置创建一个目录.
virtualenv venv
因此,这将在你的文件夹中创建一个新的虚拟环境,我们还需要激活这个虚拟环境。为了激活虚拟环境,你需要根据你的操作系统,执行一个叫做激活的文件.
对于Linux/MacOS来说:
source venv/bin/activate
因此,这就是我们创建一个虚拟环境所需要的一切,我们现在可以在这个激活的环境中安装任何python包了.
使用pip安装rich
我们现在可以在激活的虚拟环境中安全地安装任何包,要安装rich,我们需要运行以下命令:
pip install rich
这将安装rich,这是一个python包。为了验证安装是否成功,你可以在python -m命令的帮助下运行下面的命令,后面跟着软件包的名称,在这个例子中是Rich.
python -m rich
创建一个Python脚本来演示Rich 的使用
现在,由于我们在虚拟环境中安装了rich包,我们可以在python脚本中使用rich包,并在终端I/O中利用其格式化和日志风格。我们首先在python中创建一个hello word脚本,并演示rich包所提供的其他一些函数和操作符.
from rich import print
print("Hello, [bold green]Geeks[/bold green]!")
在这里,我们从刚刚安装的rich包中导入了一个叫做print的函数。这个打印函数与python提供的普通打印函数不同。尽管从技术上讲,它的目的是一样的,但它可以比普通的打印函数做得更多。在上面的例子中,print函数写了一些东西,这些东西被python解释为一种格式化风格,比如[bold green]和[/bold green].
这两个标签只是代表方括号中提供的样式的开始和结束。本例中提供的样式是粗体和绿色。你可以为文本的装饰选择一些选项,如下所示:
颜色可以从 这个链接的文档中提供的列表中选择,颜色是256种标准色以及 CSS风格的颜色格式。像粗体、斜体、下划线、反向等装饰可以从文档中的列表中提供.
创建一个信息丰富的任务展示
from time import sleep
from rich.console import Console
console = Console()
tasks = [f"Task {n}" for n in range(1, 8)]
with console.status("[bold dark_orange]Finishing tasks...")
as status:
while tasks:
task = tasks.pop(0)
sleep(1)
console.log(f"{task} complete")
上面的例子显示了在一个循环中显示各种任务的过程。这是用Console Wrapper API完成的。Console类提供了一些专门针对终端内容的扩展功能。因此,我们实例化了一个Console对象,并使用log方法来显示输出。status方法用于显示正在进行的进程,同时处于循环之中.
关于Console类中的更多选项和功能,你可以参考 Rich库的文档 .
使用rich在终端中显示表格
我们甚至可以用rich包以丰富的格式显示表格。rich包有一种在终端用 表类 来表示表格数据的方法。我们可以构造几个样本表来理解在控制台中呈现表格数据的基本原理.
from rich.align import Align
from rich.console import Console
from rich.live import Live
from rich.table import Table
TABLE_DATA = [
[
"[b white]DSA Course[/]: [i]Beginner[/]",
"[magenta][/]10",
"[green]Geeks for Geeks[/]",
"15 hours",
],
[
"[b white]DSA Course[/]: [i]Intermediate[/]",
"[magenta][/]20",
"[green]Geeks for Geeks[/]",
"25 hours",
],
[
"[b white]DSA Course[/]: [i]Advanced[/]",
"[magenta][/]30",
"[green]Geeks for Geeks[/]",
"30 hours",
],
[
"[b white]Operating System Fundamentals[/]",
"[magenta][/]25",
"[green]Geeks for Geeks[/]",
"35 hours",
],
]
console = Console()
table = Table(show_footer=False)
table_centered = Align.center(table)
console.clear()
with Live(table_centered, console=console,
screen=False):
table.add_column("Course Name", no_wrap=True)
table.add_column("Price", no_wrap=True)
table.add_column("Organization", no_wrap=True)
table.add_column("Duration", no_wrap=True)
for row in TABLE_DATA:
table.add_row(*row)
table_width = console.measure(table).maximum
table.width = None
所以,在这里我们创建了一个表对象,并进行了初步的调整,如页脚和对齐。数据首先被存储为一个python列表,这意味着你可以在其内部添加或编辑数据。通过使用函数Live,我们可以在运行时通过表类中的add_column和add_row函数动态地添加列和行的值来创建一个表.
行或实际数据是在将列插入数据后添加的,通过对列表TABLE_DATA中先前定义的值进行迭代,我们可以对整个行数据进行逐列解析。实时显示功能,于显示终端日志的实时构造,有助于脚本的可视化
我们甚至可以使用控制台的选项来简单地打印表格,而不是通过console.log函数来实时渲染表格.
console.print(table)
渲染Markdown文件
我们甚至可以通过python中rich库中的一个简单的markdown扩展来在终端渲染markdown内容。这里我们将使用一个简单的markdown文件来演示rich markdown渲染的工作。文档中提供了源代码样本,在这里我们需要做一些修改以使其工作.
from rich.console import Console
from rich.markdown import Markdown
console = Console()
with open("sample.md") as readme:
markdown = Markdown(readme.read())
console.print(markdown)
下面提供了一个markdown文件的样本:
sample.md
# Sample markdown file
Text with some paragraph
2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists
look like:
* this one
* that one
* the other one
> Block quotes
------------
Here's a numbered list:
1. first item
2. second item
3. third item
```python
n = 5
a = "GFG"
for i in range(0, 3):
print("Something")
```
### An h3 header ###
Tables can look like this:
size material color
---- ------------ ------------
9 leather brown
10 hemp canvas natural
11 glass transparent
输出
在这里,我们将实例化控制台类,因为输出将在终端/控制台进行。此后,我们可以在本地资源库中打开markdown文件,并在Markdown函数中对其进行解析,该函数将呈现内容,在读取文件内容后,我们可以在控制台中打印呈现的内容.
Rich 中的树形结构打印
我们还可以使用Rich在终端中创建一个树状结构。在Rich中有一个树类,用于在终端中显示层次结构,我们可以使用Rich的树类创建一个简单的树实例.
from rich.tree import Tree
from rich import print
tree_example = Tree("Tree's Root Node")
tree_example.add("Node 1")
print(tree_example)
输出:
树类通过从 rich.tree 模块中导入的Tree方法进行实例化。这在树中创建了一个简单的根节点,进一步,我们可以通过使用与树相关的add函数将节点添加到树中。使用这个简单的代码,我们可以通过使用rich中的控制台类来创建更多风格的树.
# rich-tree.py
from rich.console import Console
from rich.tree import Tree
console = Console(width=100)
tree = Tree("Programming Languages")
python_tree = tree.add("[b green]Python[/]")
python_tree.add("Numpy")
python_tree.add("Pandas")
python_tree.add("Django")
python_tree.add("Flask")
java_tree = tree.add("[b dark_orange3]Java[/]")
java_tree.add("Spring")
java_tree.add("Apache")
frameworks = ["Express", "React", "Next", "Vue", "Angular"]
js_tree = tree.add("[b yellow]Javascript[/]")
for framework in frameworks:
js_tree.add(framework)
console.print(tree)
CONSOLE_HTML_FORMAT = """\
<pre style="font-family:Menlo">{code}</pre>
"""
输出:
所以在这个例子中,我们使用了控制台类,通过添加宽度等参数来设置控制台的宽度和输出屏幕的宽度。接下来,我们将实例化一个树形类,它将创建一个树形对象,并将其存储在树形变量中,我们可以随心所欲地命名它,因为我们在前面的例子中已经将其命名为example_tree。正如前面演示的那样,我们可以向树添加节点,我们将把节点作为一个新的树来添加,所以我们将创建嵌套的树。通过为树变量分配add函数的返回值,我们已经添加了一个新节点,我们可以进一步添加节点.
这里,树的变量是根树,它有Python、Java和Javascript等节点,树的实例是python_tree、java_tree和js_tree。我们创建的python_tree有Numpy、Pandas和Django等节点。java_tree有Spring和Apache这样的节点,最后,我们把js_tree节点作为一个字符串的列表,使用for a loop动态添加。对于列表 “frameworks “中的每个元素,我们在js_tree中添加节点.
That’s how we can use the tree class in rich.
使用rich显示进度条
我们甚至可以使用rich在终端添加进度条。rich还给出了一个使用 track 类来显示进度条的类。track类给出了一个进度条的视图,直到循环完成,给定任务达到100%为止.
from rich.progress import track
from time import sleep
for step in track(range(10)):
sleep(1)
输出:
在这里,我们演示了一个简单的进度条的基本例子,该循环在10个数字的范围内迭代,它休眠了一秒钟,因此我们看到了进度条的过渡.
我们甚至可以异步地执行任务,并通过显示爱的进展来显示进度条.
import time
from rich.progress import Progress
with Progress() as progress:
task1 = progress.add_task("[red]Doing Task 1", total=100)
task2 = progress.add_task("[blue]Doing Task 2", total=40)
task3 = progress.add_task("[green]Doing Task 3", total=500)
while not progress.finished:
progress.update(task1, advance=0.1)
progress.update(task2, advance=0.3)
progress.update(task3, advance=0.6)
time.sleep(0.01)
输出:
为了在终端显示一些进度条,我们可以在进度类中添加使用进度函数。我们添加任务,这些任务是单独的进度条,我们递增当前的进度,我们包含了while循环,这样我们递增并执行任何操作直到进度条完成。
进度条在任务执行完毕后被递增,这里的任务只是睡眠了几分之一秒,但这可以是任何操作,如从互联网获取资源或程序中的任何其他逻辑操作。
这里,我们在进度类中加入了总参数。进度类将被显示,任务是由函数add_task添加的,它在控制台中添加了一个进度条。添加任务的函数接收了任务名称的参数,总表示进度达到100%必须完成的步骤数.