Trong phần này, ta sẽ phát triển giao diện dòng lệnh (Command Line Interface - CLI) dùng Python. Trước khi đi sâu vào code, hiểu về dòng lệnh.
Dòng lệnh được dùng kể từ khi chương trình máy tính xuất hiện và được xây dựng trên các lệnh (commands). Chương trình dòng lệnh là chương trình chạy từ shell hoặc từ dòng lệnh.
Mà giao diện dòng lệnh (CLI) cung cấp giao diện người dùng được điều hướng bằng cách gõ lệnh tại terminal, shell hoặc console thay vì dùng chuột.
Một CLI bắt đầu bằng file thực thi (executable). Có tham số (parameters) truyền cho script tùy cách phát triển:
Arguments (Đối số): Tham số bắt buộc truyền cho script. Nếu không cung cấp, CLI sẽ báo lỗi. Ví dụ: numpy là argument trong lệnh: pip install numpy.
Options (Tùy chọn): Tham số tùy chọn đi kèm cặp tên-giá trị như: pip install django –cache-dir ./my-cache-dir, trong đó –cache_dir là option param và giá trị ./my-cache-dir dùng làm thư mục cache.
Flags (Cờ): Tham số tùy chọn khác cho script bật/tắt hành vi nhất định, ví dụ tham số –help.
Python cung cấp nhiều package viết CLI như 'click'. Click cho phép xây dựng CLI với rất ít code.
Dưới là chương trình CLI không dùng package click. Viết CLI có thể không thanh lịch như dùng 'click', vì click tuân theo nguyên tắc "Don't Repeat Yourself" (DRY).
CLI không dùng package click
import sys import random def do_work(): """ Function to handle command line usage""" args = sys.argv args = args[1:] # Phần tử đầu tiên của args là tên file if len(args) == 0: print('You have not passed any commands in!') else: for a in args: if a == '--help': print('Basic command line program') print('Options:') print(' --help -> show this basic help menu.') print(' --monty -> show a Monty Python quote.') print(' --veg -> show a random vegetable') elif a == '--monty': print('He’s not the Messiah—he’s a very naughty boy') elif a == '--veg': print(random.choice(['Tomato','Reddis','Carrot', 'Potato', 'Turnip'])) else: print('Unrecognised argument.') if __name__ == '__main__': do_work() Kết quả
c:\Python\Python361>python cli_interp1.py --monty He’s not the Messiah—he’s a very naughty boy c:\Python\Python361>python cli_interp1.py --help Basic command line program Options: --help -> show this basic help menu. --monty -> show a Monty Python quote. --veg -> show a random vegetable c:\Python\Python361>python cli_interp1.py --veg Tomato c:\Python\Python361>python cli_interp1.py --error Unrecognised argument.
Như thấy, chương trình trên không cung cấp nhiều sự linh hoạt để đổi tên argument.
Dưới là cùng chương trình dùng package click của Python để triển khai CLI.
import click import random @click.command() @click.option('--monty', default=False, help='Show a Monty Python quote.') @click.option('--veg', default=False, help='Show a random vegetable.') def do_work(monty, veg): """ Basic Click example will follow your commands""" if monty: print('He’s not the Messiah—he’s a very naughty boy') if veg: print(random.choice(['Tomato','Reddis','Carrot', 'Potato', 'Turnip'])) if __name__ == '__main__': do_work() Kết quả
c:\Python\Python361>python cli_interp2.py --help Usage: cli_interp2.py [OPTIONS] Basic Click example will follow your commands Options: --monty TEXT Show a Monty Python quote. --veg TEXT Show a random vegetable. --help Show this message and exit.
Chương trình trên cho thấy, viết CLI dùng 'click' dễ dàng hơn nhiều và tiết kiệm công sức lập trình viên.