Tạo một CLI app đơn giản với Python
Bài đăng này đã không được cập nhật trong 6 năm
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 commandls
để 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ề commandls
.
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
và --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
[2] argparse docs
All rights reserved