Tạo một CLI app đơn giản với Python
TIL
633
python3
2
Cli
3
White

Đinh Văn Cảnh viết ngày 21/01/2018

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

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Đinh Văn Cảnh

6 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
8 0
Prototype là khái niệm cốt lõi trong JavaScript và là cơ chế quan trọng trong việc thực thi mô hình OOP trong JavaScript (nhưng không thực sự hoàn ...
Đinh Văn Cảnh viết 1 năm trước
8 0
White
2 0
Trong quá trình cài đặt các tool phục vụ cho việc lập trình trên Ubuntu, hẳn các bạn đã từng phải vật vã với đủ thứ config, chẳng hạn như khi cài J...
Đinh Văn Cảnh viết 11 tháng trước
2 0
White
2 0
Web crawling là gì? _Web crawling_ là quá trình tự động trích xuất các thông tin từ các trang web và lưu trữ nó dưới một định dạng phù hợp. Chương...
Đinh Văn Cảnh viết 8 tháng trước
2 0
Bài viết liên quan
White
20 5
(Ảnh) Mở đầu CLI App là viết tắt của Command Line Interface App, tức là những app sử dụng trên terminal. Có lẽ những ai quen thuộc về hệ thống c...
huydx viết hơn 2 năm trước
20 5
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 5 tháng trước
0 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
6 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!