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: $ ...
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 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
[1] argparse tutorial
[2] argparse docs