Tutorial

ทำ Command Line Interface ให้อลังการด้วย Rich

By Arnon Puitrakul - 18 พฤษภาคม 2022

ทำ Command Line Interface ให้อลังการด้วย Rich

ปกติเวลาเราเขียนโปรแกรมออกมาจริง ๆ อะ บ้างแหละ ที่เราเขียนออกมาเป็น GUI แต่ส่วนใหญ่แล้ว โปรแกรมที่เราใช้งานกัน เอาแบบ Developer หรือพวก Server ใช้งานกันก็จะอยู่ในรูปแบบของ Command Line ซะส่วนใหญ่ รุ่นใหญ่เขาใช้กันเว้ย แต่มันก็ดูเหือดแห้งเหลือเกิน เราอาจจะเคยเห็นบางโปรแกรมที่มีพวก Animation หรือการใส่สีลงไปใน Command Line ได้ด้วยเหมือนกัน สำหรับใน Python เองก็มี Library ที่ทำอะไรแบบนี้เหมือนกันคือ Rich นั่นเอง

ติดตั้ง Rich

// Conda
conda install rich

// Pip
pip install rich

เรามาติดตั้ง ความรวย กันดีกว่า ชื่อก็คือ รู้สึกถึงเงินแล้ว เราสามารถติดตั้งมันได้จาก Package Manager ที่เราใช้งานตรง ๆ ได้เลย เช่น Conda และ Pip เป็นต้น

ใส่ Style ให้ตัวหนังสือ

เรามาเริ่มกับอะไรที่ Basic กันก่อนดีกว่า คือ การใส่พวก สี และ Style ให้ตัวหนังสือ เช่น ตัวหนา ตัวเอียงอะไรแบบนั้น มันก็ทำได้เหมือนกัน แล้วบอกเลยว่า โคตรง่าย

from rich import print

print("If you [u]smoke[/u] [i](what you [green]smoke?[/green])[/i] I got the [u]haze[/u] [bold purple](Purple Haze)[/bold purple]")

เราแค่เรียกคำสั่ง print ออกมาจาก rich ตรง ๆ ได้เลย มันก็จะไปทับ คำสั่ง print ปกติออกไป แล้วเราก็สามารถใส่ Styling ได้ตามที่เราต้องการเลย เช่น u ก็คือ Underline หรือขีดเส้นใต้ นอกจากนั้น เราก็สามารถใส่สีได้ด้วย ผ่านการพิมพ์ชื่อสีเข้าไปตรง ๆ ได้เลย

เราก็จะได้แบบด้านบนเลย เราจะเห็นว่า ตรงที่เราใส่เขียว มันก็จะเขียวเลย กับตรงที่เราใส่ bold purple มันก็จะได้ออกมาเป็นตัวหนาสีม่วง แค่นี้ก็ทำให้มันอลังการแล้ว แต่ ๆๆ มันยังไม่หมด

Inspect

>>> dir(list)
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

เวลาเราเรียกพวก Method อยากรู้ว่ามันทำอะไรได้บ้าง เราก็จะเรียกมันออกมาเช่น อยากรู้ว่า list ในนั้นมันมีอะไรบ้าง เราก็สามารถใช้คำสั่ง dir(list) ตรง ๆ ได้เลย แต่เราจะเห็นว่า มันก็แอบดูยากไปหน่อย ไม่สวยงามเลย ใน Rich เองมันก็มีอะไรแบบนี้มาให้เราด้วย

from rich import inspect
inspect(list, methods=True)
ทำ Command Line Interface ให้อลังการด้วย Rich

เราก็จะได้แบบด้านบนเลย มันก็จะแสดงออกมาเลยว่า มันเป็นอะไร แล้วในนั้นมันมี Method อะไรบ้าง พร้อมกับบอกเลยว่ามันทำอะไร ถ้าเราไม่ได้ใช้ List เราก็ต้องเข้าไปเปิดทีละคำสั่งว่าอันไหนมันทำอะไรยังไงบ้าง แต่อันนี้เขาทำมาให้เราหมดแล้ว ดีมาก ๆ เวลเราเขียนโปรแกรม

Logging

ทำ Command Line Interface ให้อลังการด้วย Rich

อีกหนึ่งอย่างที่เราใช้เยอะมาก แล้วมันดีมาก ๆ คือ การทำ Logging ปกติ เราก็ใช้งาน Logging ใน Python อยู่แล้วนะ เพราะมันทำให้เราจัดการ Log ได้ง่ายมาก ๆ ตั้งแต่การบอกปลายทางว่า เราจะออกหน้าจอ และออกไฟล์อะไรแบบนั้น

Logging ใน Rich ก็ทำมาให้ง่ายเลยละ ถ้าเราคุ้นเคยกับ Logging ใน Python อยู่แล้ว เราก็แค่กำหนด Style ของ Log แล้วใช้งานผ่านคำสั่งของ Python Log ได้ตามปกติเลย ดังนั้น เราแทบไม่จำเป็นต้องเปลี่ยนแปลง Code เยอะเลย เพื่อให้เราสามารถมาใช้งานบน Rich ได้ ที่เหลือ ก็น่าจะเป็นแค่การตกแต่งให้เรียบร้อยเท่านั้นเอง

สรุป

จริง ๆ Rich ทำได้เยอะกว่านี้มาก ๆ เช่น พวก Progress Bar จนไปถึงพวกการวาดตาราง และพวก Markdown ทำได้หมดเลย คือ เราทำได้ตั้งแต่ CLI ง่าย ๆ จนไปถึงพวกที่เป็น Rich CLI อลังการงานสร้าง แบ่ง Panel แล้วทำงานนั่นนี่ได้แบบ สุด ๆ ไปเลย พวกนี้ที่เหลือ ก็ขึ้นกับจินตนาการของเราแล้วละว่า เราจะเอามันมาทำอะไร แต่ส่วนใหญ่ที่เราใช้งาน เราก็ใช้งานในส่วนที่เราเอามาเขียนให้อ่านกันวันนี้เลย

Read Next...

ปกป้อง Ubuntu ผ่าน Firewall แบบง่าย ๆ ด้วย UFW

ปกป้อง Ubuntu ผ่าน Firewall แบบง่าย ๆ ด้วย UFW

Firewall ถือว่าเป็นเครื่องมือในการป้องกันภัยขั้นพื้นฐานที่ปัจจุบันใคร ๆ ก็ติดตั้งใช้งานกันอยู่แล้ว แต่หากเรากำลังใช้ Ubuntu อยู่ จริง ๆ แล้วเขามี Firewall มาให้เราใช้งานได้เลยนะ มันชื่อว่า UFW วันนี้เราจะมาทำความรู้จัก และทดลองตั้ง Rule สำหรับการดักจับการเชื่อมต่อที่ไม่เกี่ยวข้องกันดีกว่า...

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

นอกจากการทำให้ Application รันได้แล้ว อีกเรื่องที่สำคัญไม่แพ้กันคือการวางระบบ Monitoring ที่ดี วันนี้เราจะมาแนะนำวิธีการ Monitor การทำงานของ MySQL ผ่านการสร้าง Dashboard บน Grafana กัน...