26 KiB
English readme • 简体中文 readme • 正體中文 readme • Lengua española readme • Deutsche readme • Läs på svenska • 日本語 readme • 한국어 readme • Français readme • Schwizerdütsch readme • हिन्दी readme • Português brasileiro readme • Italian readme • Русский readme • فارسی readme • Türkçe readme • Polskie readme
Rich это Python библиотека, позволяющая отображать красивый текст и форматировать терминал.
Rich API упрощает добавление цветов и стилей к выводу терминала. Rich также позволяет отображать красивые таблицы, прогресс бары, markdown, код с подсветкой синтаксиса, ошибки, и т.д. — прямо после установки.
Смотрите видеоинструкцию calmcode.io от @fishnets88.
Посмотрите что люди думают о Rich.
Cовместимость
Rich работает с Linux, OSX и Windows. True color / эмоджи работают с новым терминалом Windows, классический терминал лимитирован 16 цветами. Rich требует Python 3.6.3 или более новый.
Rich работает с Jupyter notebooks без дополнительной конфигурации.
Установка
Установите с помощью pip
или вашего любимого PyPI менеджера пакетов.
python -m pip install rich
Запустите следующую команду, чтобы проверить Rich вывод в вашем терминале:
python -m rich
Rich Print
Простейший способ получить красивый вывод это импортировать метод rich print, он принимает такие же аргументы что и стандартный метод print
. Попробуйте:
from rich import print
print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
Rich REPL
Rich может быть установлен в Python REPL, так, все данные будут выведены через Rich.
>>> from rich import pretty
>>> pretty.install()
Использование класса Console
Для большего контроля над терминалом Rich, импортируйте и инициализируйте класс Console.
from rich.console import Console
console = Console()
У класса Сonsole есть метод print
который имеет идентичный встроенной функции функционал print
. Вот пример использования:
console.print("Hello", "World!")
Как вы могли догадаться, это выведет Hello World!
в терминал. Запомните что, в отличии от встроенной функции print
, Rich настроит переносы слов так, чтобы ваш текст соответствовал ширине терминала.
Есть несколько способов добавить цвет и стиль к вашему выводу. Вы можете выбрать стиль для всего вывода добавив аргумент style
. Вот пример:
console.print("Hello", "World!", style="bold red")
Вывод будет выглядеть примерно так:
Этого достаточно чтобы стилизовать 1 строку. Для более детальной стилизации, Rich использует специальную разметку похожую по синтаксису на bbcode. Вот пример:
console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].")
Вы можете использовать класс Console чтобы генерировать красивый вывод с минимальными усилиями. Для получения детальной информации смотрите документацию Console API.
Rich Inspect
В Rich имеется функция inspect которая может украсить любой Python объект, например класс, переменную, или функцию.
>>> my_list = ["foo", "bar"]
>>> from rich import inspect
>>> inspect(my_list, methods=True)
Для получения детальной информации смотрите документацию inspect.
Библиотека Rich
Rich содержит несколько встроенных визуализаций которые вы можете использовать чтобы сделать красивый вывод в вашем CLI, а также они помогают в отладке кода.
Вот несколько вещей которые может делать Rich (нажмите чтобы узнать больше):
Лог
В классе Сonsole есть метод log()
который имеет интерфейс, аналогичный print()
, но также отображает колонку текущим временем, именем файла и номером строки кода в которой был вызван метод. По умолчанию Rich будет подсвечивать синтаксис для структур Python и для строк repr. Если вы передадите в метод коллекцию (т.е. dict или list) Rich выведет её так, чтобы она разместилась в доступном пространстве. Вот пример использования этого метода.
from rich.console import Console
console = Console()
test_data = [
{"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",},
{"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
{"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"},
]
def test_log():
enabled = False
context = {
"foo": "bar",
}
movies = ["Deadpool", "Rise of the Skywalker"]
console.log("Hello from", console, "!")
console.log(test_data, log_locals=True)
test_log()
Приведенный выше код выведет это:
Обратите внимание на аргумент log_locals
, который выводит таблицу, содержащую локальные переменные функции, в которой был вызван метод log.
Метод может быть использован для вывода данных в терминал в длительно работающих программ, таких как сервера, но он также может помочь в отладке.
Обработчик Логов
Вы также можете использовать встроенный класс Handler чтобы форматировать и раскрашивать вывод из встроенной библиотеки logging. Вот пример вывода:
Эмоджи
Чтобы вставить эмоджи в вывод консоли, поместите его название между двумя двоеточиями. Вот пример:
>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:")
😃 🧛 💩 👍 🦝
Пожалуйста, используйте эту функцию с умом.
Таблицы
Rich может отображать гибкие настраиваемые таблицы с помощью символов unicode. Есть большое количество вариантов границ, стилей, выравниваний ячеек и т.п.
Эта анимация была сгенерирована с помощью table_movie.py в папке примеров.
Вот пример более простой таблицы:
from rich.console import Console
from rich.table import Table
console = Console()
table = Table(show_header=True, header_style="bold magenta")
table.add_column("Date", style="dim", width=12)
table.add_column("Title")
table.add_column("Production Budget", justify="right")
table.add_column("Box Office", justify="right")
table.add_row(
"Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118"
)
table.add_row(
"May 25, 2018",
"[red]Solo[/red]: A Star Wars Story",
"$275,000,000",
"$393,151,347",
)
table.add_row(
"Dec 15, 2017",
"Star Wars Ep. VIII: The Last Jedi",
"$262,000,000",
"[bold]$1,332,539,889[/bold]",
)
console.print(table)
Этот пример выводит:
Обратите внимание, что разметка осуществляется таким же способом, что и print()
и log()
. На самом деле, все, что может быть отображено Rich, может быть включено в заголовки / строки (даже в другие таблицы).
Класс Table
достаточно умный чтобы менять размер столбцов, так, чтобы они заполняли доступную ширину терминала, обёртывая текст как нужно. Вот тот же самый пример с терминалом меньше таблицы:
Прогресс Бары
Rich может отображать несколько плавных прогресс баров чтобы отслеживать долго-идущие задания.
Для базового использования, оберните любую последовательность в функцию track
и выполните итерации по результату. Вот пример:
from rich.progress import track
for step in track(range(100)):
do_step(step)
Добавить несколько индикаторов выполнения не намного сложнее. Вот пример взятый из документации:
Столбцы могут быть сконфигурированы таким образом, чтобы отображать любые сведения, которые вы хотите. Стандартные столбцы содержат проценты выполнения, размер файлы, скорость файла и оставшееся время. Вот ещё пример показывающий прогресс загрузки:
Чтобы попробовать самому, скачайте examples/downloader.py, который может загружать несколько URL-адресов одновременно, отображая прогресс.
Статус
Для ситуаций где сложно вычислить прогресс, вы можете использовать метод статус который будет отображать крутящуюся анимацию и сообщение. Анимация не помешает вам использовать консоль в обычном режиме. Вот пример:
from time import sleep
from rich.console import Console
console = Console()
tasks = [f"task {n}" for n in range(1, 11)]
with console.status("[bold green]Working on tasks...") as status:
while tasks:
task = tasks.pop(0)
sleep(1)
console.log(f"{task} complete")
Это сгенерирует вот такой вывод в консоль.
Крутящиеся анимации были взяты из cli-spinners. Вы можете выбрать одну из них указав параметр spinner
. Введите следующую команду чтобы посмотреть доступные анимации:
python -m rich.spinner
Приведенная выше команда сгенерирует следующий вывод в терминале:
Дерево
Rich может отобразить дерево с направляющими уровнями. Дерево идеально подходит для отображения структуры файлов или любых других иерархических данных.
Метки дерева могут быть содержать простой текст или чем-либо еще, что может отобразить Rich. Запустите следующую команду для демонстрации:
python -m rich.tree
Это генерирует следующий вывод:
Смотрите пример tree.py скрипта,который отображает древовидное представление любого каталога, аналогично команде linux tree
.
Колонки
Rich может отображать контент в аккуратных колонках с равной или оптимальной шириной. Вот очень простой пример клона команды ls
(MacOS / Linux) который отображает список файлов из папки в виде колонок:
import os
import sys
from rich import print
from rich.columns import Columns
directory = os.listdir(sys.argv[1])
print(Columns(directory))
Следующий снимок экрана является примером колонок который изображает данные взятые из API в столбцах:
Markdown
Rich может отображать markdown, проделывая неплохую работу в форматировании под терминал.
Чтобы отобразить markdown импортируйте класс Markdown
и инициализируйте его с помощью строки содержащей код markdown. Затем распечатайте его в консоли. Вот пример:
from rich.console import Console
from rich.markdown import Markdown
console = Console()
with open("README.md") as readme:
markdown = Markdown(readme.read())
console.print(markdown)
Это выведет что-то похожее на это:
Подсветка синтаксиса
Rich использует библиотеку pygments чтобы выполнить подсветку синтаксиса. Использование аналогично рендерингу markdown; создайте объект Syntax
и выведите его на консоль. Вот пример:
from rich.console import Console
from rich.syntax import Syntax
my_code = '''
def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]:
"""Iterate and generate a tuple with a flag for first and last value."""
iter_values = iter(values)
try:
previous_value = next(iter_values)
except StopIteration:
return
first = True
for value in iter_values:
yield first, False, previous_value
first = False
previous_value = value
yield first, True, previous_value
'''
syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True)
console = Console()
console.print(syntax)
Это выведет что-то похожее на это:
Ошибки
Rich может отображать красивый стек ошибок, который проще читать, и показывает больше информации чем стандартные стек ошибок Python. Вы можете установить Rich как стандартный обработчик ошибок чтобы все не перехваченные исключения отображались Rich.
Вот как это выглядит на OSX (похоже на Linux):
Все визуализации Rich используют протокол Console, который позволяет вам добавлять свой собственный Rich контент.
Rich CLI
Смотрите также Rich CLI для получения информации о приложении командной строки, работающего на базе Rich. Подсветка синтаксиса кода, рендеринг markdown, отображение CSV-файлов в таблицах и многое другое доступно непосредственно из командной строки.
Textual
Смотрите также дочерний проект Rich, Textual, который вы можете использовать для создания сложных пользовательских интерфейсов в терминале.
Rich для предприятий
Rich доступен как часть подписки Tidelift.
Ментейнеры проекта Rich, как и тысячи других разработчиков работают с подпиской Tidelift чтобы предоставить коммерческую поддержку и поддержку для проектов с открытым кодом, которые вы используете для создания своих приложений. Экономьте время, устраняйте риски и улучшайте состояние вашего кода, одновременно платя спонсорам проектов, которые вы используете. Узнайте больше.
Проекты использующие Rich
Вот несколько проектов использующих Rich:
- BrancoLab/BrainRender библиотека Python для визуализации нейроанатомических данных в 3 измерениях
- Ciphey/Ciphey автоматизированная утилита для расшифровки
- emeryberger/scalene Высокая производительность, высокая точность CPU и профилировщик памяти для Python
- hedythedev/StarCli Просматривайте трендовые проекты GitHub прямо из вашего терминала
- intel/cve-bin-tool Эта утилита сканирует известные уязвимости (openssl, libpng, libxml2, expat and a few others) чтобы уведомить вас, если ваша система использует библиотеки с известными уязвимостями.
- nf-core/tools Библиотека Python с полезными инструментами для сообщества nf-core.
- cansarigol/pdbr pdb + Rich библиотека для улучшенного дебаггинга
- plant99/felicette Изображения со спутников для чайников.
- seleniumbase/SeleniumBase Автоматизируйте и тестируйте в 10 раз быстрее с Selenium и pytest. Батарейки включены.
- smacke/ffsubsync Автоматически синхронизируйте субтитры с видео.
- tryolabs/norfair Простая библиотека Python для добавления 2D отслеживания к любому детектеру в реальном времени.
- ansible/ansible-lint Ansible-lint проверяет пьесы для практик и поведений которые могут быть исправлены
- ansible-community/molecule Ansible Molecule тестинг фреймворк
- +Ещё больше!