ภาษาอังกฤษ 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 • ภาษาอิตาลี readme • Русский readme • ภาษาอินโดนีเซีย readme • فارسی readme • Türkçe readme • Polskie readme
Rich เป็นไลบรารี Python สำหรับ Rich Text และการจัดรูปแบบที่สวยงามในเทอร์มินัล
Rich API ช่วยให้การเพิ่มสีและสไตล์ให้กับเอาต์พุตเทอร์มินัลเป็นเรื่องง่าย Rich ยังสามารถเรนเดอร์ตารางสวยๆ แถบความคืบหน้า มาร์กดาวน์ ซอร์สโค้ดที่เน้นไวยากรณ์ การย้อนกลับ และอื่นๆ อีกมากมายได้ทันทีที่แกะกล่อง
สำหรับวิดีโอแนะนำ Rich โปรดดูที่ Calmcode.io โดย @fishnets88
ดูว่าผู้คนพูดถึงริชอย่างไร
Rich ใช้งานได้กับ Linux, macOS และ Windows True color / emoji ใช้งานได้กับ Windows Terminal ใหม่ เทอร์มินัลแบบคลาสสิกจำกัดไว้ที่ 16 สี Rich ต้องใช้ Python 3.8 หรือใหม่กว่า
Rich ใช้งานได้กับโน้ตบุ๊ก Jupyter โดยไม่ต้องกำหนดค่าเพิ่มเติม
ติดตั้งด้วย pip
หรือตัวจัดการแพ็คเกจ PyPI ที่คุณชื่นชอบ
python -m pip install rich
รันสิ่งต่อไปนี้เพื่อทดสอบ Rich Output บนเทอร์มินัลของคุณ:
python -m rich
หากต้องการเพิ่มเอาต์พุตที่หลากหลายให้กับแอปพลิเคชันของคุณอย่างง่ายดาย คุณสามารถนำเข้าวิธีการพิมพ์ที่หลากหลายซึ่งมีลายเซ็นเดียวกับฟังก์ชัน Python ในตัว ลองสิ่งนี้:
from rich import print
print ( "Hello, [bold magenta]World[/bold magenta]!" , ":vampire:" , locals ())
Rich สามารถติดตั้งได้ใน Python REPL ดังนั้นโครงสร้างข้อมูลใดๆ จึงสามารถพิมพ์และเน้นสีได้ค่อนข้างดี
>> > from rich import pretty
>> > pretty . install ()
หากต้องการควบคุมเนื้อหาเทอร์มินัลที่หลากหลายยิ่งขึ้น ให้นำเข้าและสร้างออบเจ็กต์คอนโซล
from rich . console import Console
console = Console ()
วัตถุคอนโซลมีวิธี print
ซึ่งมีอินเทอร์เฟซที่คล้ายกันโดยเจตนากับฟังก์ชัน print
ในตัว นี่คือตัวอย่างการใช้งาน:
console . print ( "Hello" , "World!" )
อย่างที่คุณคาดหวัง ข้อความนี้จะพิมพ์ว่า "Hello World!"
ไปยังอาคารผู้โดยสาร โปรดทราบว่า Rich จะตัดข้อความของคุณให้พอดีกับความกว้างของเทอร์มินัล ซึ่งต่างจากฟังก์ชัน print
ในตัว
มีหลายวิธีในการเพิ่มสีและสไตล์ให้กับผลงานของคุณ คุณสามารถกำหนดสไตล์สำหรับเอาต์พุตทั้งหมดได้โดยเพิ่มอาร์กิวเมนต์คีย์เวิร์ด style
นี่คือตัวอย่าง:
console . print ( "Hello" , "World!" , style = "bold red" )
ผลลัพธ์จะมีลักษณะดังนี้:
ซึ่งเป็นเรื่องปกติสำหรับการจัดสไตล์บรรทัดข้อความในแต่ละครั้ง เพื่อสไตล์ที่ละเอียดยิ่งขึ้น Rich จะเรนเดอร์มาร์กอัปพิเศษซึ่งคล้ายกับไวยากรณ์ของ bbcode นี่คือตัวอย่าง:
console . print ( "Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i]." )
คุณสามารถใช้ออบเจ็กต์คอนโซลเพื่อสร้างเอาต์พุตที่ซับซ้อนได้โดยใช้ความพยายามเพียงเล็กน้อย ดูเอกสาร Console API สำหรับรายละเอียด
Rich มีฟังก์ชันตรวจสอบซึ่งสามารถสร้างรายงานเกี่ยวกับออบเจ็กต์ Python ใดๆ ได้ เช่น คลาส อินสแตนซ์ หรือบิวด์อิน
>> > my_list = [ "foo" , "bar" ]
>> > from rich import inspect
>> > inspect ( my_list , methods = True )
ดูเอกสารการตรวจสอบสำหรับรายละเอียด
Rich มี ตัวเรนเดอร์ ในตัวจำนวนหนึ่งที่คุณสามารถใช้เพื่อสร้างเอาต์พุตที่หรูหราใน CLI ของคุณและช่วยคุณแก้ไขข้อบกพร่องโค้ดของคุณ
คลิกหัวข้อต่อไปนี้เพื่อดูรายละเอียด:
วัตถุคอนโซลมีวิธี log()
ซึ่งมีอินเทอร์เฟซที่คล้ายกันใน print()
แต่ยังแสดงคอลัมน์สำหรับเวลาปัจจุบันและไฟล์และบรรทัดที่ทำการโทร ตามค่าเริ่มต้น Rich จะทำการเน้นไวยากรณ์สำหรับโครงสร้าง Python และสำหรับสตริง repr หากคุณบันทึกคอลเลกชัน (เช่น dict หรือรายการ) 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 ในตัวเพื่อจัดรูปแบบและปรับสีเอาต์พุตจากโมดูลการบันทึกของ Python นี่คือตัวอย่างของผลลัพธ์:
หากต้องการแทรกอิโมจิในเอาต์พุตคอนโซล ให้วางชื่อระหว่างเครื่องหมายโคลอนสองตัว นี่คือตัวอย่าง:
>> > 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 )
การเพิ่มแถบความคืบหน้าหลายแถบไม่ใช่เรื่องยากอีกต่อไป นี่คือตัวอย่างที่นำมาจากเอกสาร:
คอลัมน์อาจถูกกำหนดค่าให้แสดงรายละเอียดตามที่คุณต้องการ คอลัมน์ในตัวประกอบด้วยเปอร์เซ็นต์ที่เสร็จสมบูรณ์ ขนาดไฟล์ ความเร็วของไฟล์ และเวลาที่เหลืออยู่ นี่เป็นอีกตัวอย่างหนึ่งที่แสดงการดาวน์โหลดที่กำลังดำเนินการ:
หากต้องการลองด้วยตัวเอง โปรดดูตัวอย่าง/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-spinner คุณสามารถเลือกสปินเนอร์ได้โดยระบุพารามิเตอร์ 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 ในคอลัมน์:
Rich สามารถเรนเดอร์มาร์กดาวน์และทำงานที่เหมาะสมในการแปลการจัดรูปแบบไปยังเทอร์มินัล
หากต้องการเรนเดอร์มาร์กดาวน์ ให้นำเข้าคลาส 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 เพื่อใช้การเน้นไวยากรณ์ การใช้งานคล้ายกับการเรนเดอร์มาร์กดาวน์ สร้างวัตถุ 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):
การเรนเดอร์แบบสมบูรณ์ทั้งหมดใช้ Console Protocol ซึ่งคุณสามารถใช้เพื่อนำเนื้อหาแบบสมบูรณ์ของคุณเองไปใช้ได้เช่นกัน
ดูเพิ่มเติมที่ Rich CLI สำหรับแอปพลิเคชันบรรทัดคำสั่งที่ขับเคลื่อนโดย Rich โค้ดเน้นไวยากรณ์ เรนเดอร์มาร์กดาวน์ แสดง CSV ในตาราง และอื่นๆ โดยตรงจากพร้อมท์คำสั่ง
ดูเพิ่มเติมที่ Textual โปรเจ็กต์ในเครือของ Rich ซึ่งคุณสามารถใช้เพื่อสร้างอินเทอร์เฟซผู้ใช้ที่ซับซ้อนในเทอร์มินัล