+4

Tạo một CLI app đơn giản với Python

Hôm nay mình xin chia sẻ với các bạn một module khá là tiện dụng của python trong việc tạo một CLI app đơn giản và nhanh chóng. Đó là module có tên là argparse. Trong bài viết này, mình sẽ sử dụng python 3.

Cấu trúc cơ bản của một CLI app

Hãy cùng xem xét một command cơ bản của Linux sau:

$ ls
Desktop    Pictures		Documents
...
$ ls ~/workspace/python3
bin  include  lib  lib64  pip-selfcheck.json  pyvenv.cfg  share
$ ls -l
drwxr-xr-x 2 vancanhuit vancanhuit  4096 Th01 19 20:17 Desktop
drwxr-xr-x 2 vancanhuit vancanhuit  4096 Th01 19 18:20 Documents
...
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
...

Quan sát bốn command trên, chúng ta thấy:

  • Command ls sẽ liệt kê tất cả những gì có trong directory hiện tại. Đây là trường hợp default của nó.
  • Command ls ~/workspace/python3 sẽ liệt kê tất cả những gì có trong directory ~/workspace/python3 mà chúng ta chỉ định như là một positional argument.
  • Chúng ta đã thêm optional argument -l (short option) cho command ls để liệt kê chi tiết hơn các thông tin về file và directory.
  • Cuối cùng, command ls --help sẽ hiển thị thông tin chi tiết về command ls.

Tạo command line parser với argparse

Bây giờ, gỉả sử bạn cần xây dựng một script để nén một file. Khi đó các argument cần có cho script của chúng ta có thể như sau:

  • input_file: Đây là file sẽ được nén và là positional argument.
  • output_file: Đây là file sau khi nén. Đây là một positional argument và có thể cho một gíá trị default.
  • alg: Thuật toán nén sẽ được sử dụng. Đây sẽ là optional argument và cũng sẽ có một gíá trị default.

Module argparse cho phép chúng ta thực hiện những điều trên vô cùng trực quan như sau:

#!/usr/bin/env python3
import argparse

# Initialize parser with a short description
parser = argparse.ArgumentParser(description='Compress a file using various algorithms')

# Add positional and optional arguments
parser.add_argument('input_file', help='file to be compressed')
parser.add_argument('output_file', help='compressed output file')
parser.add_argument('--alg', help='algorithm will be used')

# Parse argument
args = parser.parse_args()

print('Input file: {}'.format(args.input_file))
print('Output file: {}'.format(args.output_file))
print('Algorithm: {}'.format(args.alg))

Bây giờ hãy lưu script trên vào file có tên compress.py và chạy nó:

$ chmod u+x compress.py
$ ./compress.py --help
usage: compress.py [-h] [--alg ALG] input_file output_file

Compress a file using various algorithms

positional arguments:
  input_file   file to be compressed
  output_file  compressed output file

optional arguments:
  -h, --help   show this help message and exit
  --alg ALG    algorithm will be used
  
$ ./compress.py file1 file2
Input file: file1
Output file: file2
Algorithm: None

$ ./compress.py --alg=alg1 file1 file2
Input file: file1
Output file: file2
Algorithm: alg1

$ ./compress.py
usage: compress.py [-h] [--alg ALG] input_file output_file
compress.py: error: the following arguments are required: input_file, output_file

$ ./compress.py file1
usage: compress.py [-h] [--alg ALG] input_file output_file
compress.py: error: the following arguments are required: output_file

Rất trực quan và dễ hiểu. Ở trên chúng ta đã tạo một parser với một description ngắn, thêm các positional và optional argument cho script. Parser tự động hiểu các argument có tên dạng -o(short option) hay --option(long option) là các optional argument.

Các positional argument là bắt buộc, nếu thiếu bất kì argument nào thì chương trình sẽ báo lỗi. Còn các optional argument mặc định sẽ là None nếu ta không gán giá trị cho nó.

Parser tự động tạo một help text và cung cấp sẵn các option -h--help để truy cập vào help text này.

Để chương trình của chúng ta tiện dụng hơn, chúng ta sẽ cho output_file một giá trị default, cung cấp các giá trị mà alg có thể nhận và cũng cho nó một gíá trị default như sau:

#!/usr/bin/env python3
import argparse

# Initialize parser with a short description
parser = argparse.ArgumentParser(description='Compress a file using various algorithms')

# Add positional and optional arguments
parser.add_argument('input_file', help='file to be compressed')
parser.add_argument('output_file', help='compressed output file', nargs='?', default='file2')
parser.add_argument('--alg', help='algorithm will be used, default is alg1', choices=['alg1', 'alg2', 'alg3'], default='alg1')

# Parse argument
args = parser.parse_args()

print('Input file: {}'.format(args.input_file))
print('Output file: {}'.format(args.output_file))
print('Algorithm: {}'.format(args.alg))
$ ./compress.py -h
usage: compress.py [-h] [--alg {alg1,alg2,alg3}] input_file [output_file]

Compress a file using various algorithms

positional arguments:
  input_file            file to be compressed
  output_file           compressed output file

optional arguments:
  -h, --help            show this help message and exit
  --alg {alg1,alg2,alg3}
                        algorithm will be used, default is alg1
                        
$ ./compress.py file1 
Input file: file1
Output file: file2
Algorithm: alg1

$ ./compress.py file1 file3 
Input file: file1
Output file: file3
Algorithm: alg1

$ ./compress.py --alg=alg2 file1
Input file: file1
Output file: file2
Algorithm: alg2

$ ./compress.py --alg=alg4 file1
usage: compress.py [-h] [--alg {alg1,alg2,alg3}] input_file [output_file]
compress.py: error: argument --alg: invalid choice: 'alg4' (choose from 'alg1', 'alg2', 'alg3')

Ở trên chúng ta đã cho output_file gíá trị default là file2, cung cấp ba lựa chọn alg1, alg2, alg3 cho alg, đồng thời cũng cũng gán cho nó một gíá trị default là alg1. Nếu gíá trị mà chúng ta cung cấp cho alg không nằm trong số ba gíá trị đó, chương trình sẽ báo lỗi.

Kết

Ở trên mình đã giới thiệu sơ lược về cách sử dụng module argparse có sẵn của python để xây dựng một CLI app đơn giản một cách nhanh chóng. Hi vọng bài viết có ích cho các bạn.

Xem thêm

[1] argparse tutorial

[2] argparse docs


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí