Rất thường chúng ta cần truyền đối số cho script Python khi thực thi từ dòng lệnh. Tuy nhiên, script ném ra ngoại lệ khi các tham số cần thiết không được cung cấp bằng số lượng, kiểu hoặc thứ tự bằng nhau. Đó là nơi nhu cầu phân tích đúng đối số dòng lệnh xảy ra.
Mô-đun argparse cung cấp công cụ để viết giao diện dòng lệnh rất dễ sử dụng. Nó xử lý cách phân tích các đối số thu thập trong danh sách sys.argv, tự động tạo trợ giúp và đưa ra thông báo lỗi khi các tùy chọn không hợp lệ được đưa ra.
Bước đầu để thiết kế giao diện dòng lệnh là thiết lập đối tượng parser. Điều này được thực hiện bởi hàm ArgumentParser() trong mô-đun argparse. Hàm có thể được cho một chuỗi giải thích làm tham số description.
Để bắt đầu, script của chúng ta sẽ được thực thi từ dòng lệnh không có bất kỳ đối số nào. Vẫn dùng phương thức parse_args() của đối tượng parser, nó không làm gì vì không có đối số nào được đưa ra.
import argparse parser = argparse.ArgumentParser(description="sample argument parser") args = parser.parse_args()
Khi script trên được chạy:
C:\python36>python argparser1.py C:\python36>python argparser1.py --help usage: argparser1.py [-h] sample argument parser optional arguments: -h, --help show this help message and exit
Lệnh dòng lệnh thứ hai đưa ra tùy chọn --help tạo ra thông điệp trợ giúp như hiển thị. Tham số --help có sẵn theo mặc định.
Bây giờ hãy định nghĩa một đối số bắt buộc cho script để chạy và nếu không đưa ra script nên ném lỗi. Ở đây chúng ta định nghĩa đối số user bằng phương thức add_argument().
import argparse
parser = argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user")
args = parser.parse_args()
if args.user == "Admin":
print("Hello Admin")
else:
print("Hello Guest")Trợ giúp của script này bây giờ hiển thị một đối số vị trí (positional argument) dưới dạng user. Chương trình kiểm tra nếu giá trị của nó là Admin hay không và in thông báo tương ứng.
C:\python36>python argparser1.py --help usage: argparser1.py [-h] user sample argument parser positional arguments: user optional arguments: -h, --help show this help message and exit C:\python36>python argparser1.py Admin Hello Admin C:\python36>python argparser1.py temp Hello Guest
Chúng ta có thể gán giá trị mặc định cho một đối số trong phương thức add_argument().
import argparse
parser = argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user", nargs='?', default="Admin")
args = parser.parse_args()
if args.user == "Admin":
print("Hello Admin")
else:
print("Hello Guest")Ở đây nargs là số lượng đối số dòng lệnh nên được tiêu thụ. '?'. Một đối số sẽ được tiêu thụ từ dòng lệnh nếu có thể, và tạo ra như một mục đơn. Nếu không có đối số dòng lệnh nào hiện diện, giá trị từ default sẽ được tạo ra.
C:\python36>python argparser1.py Hello Admin C:\python36>python argparser1.py Admin Hello Admin C:\python36>python argparser1.py test Hello Guest
Mặc định, tất cả đối số được coi như chuỗi. Để tường minh đề cập kiểu của đối số, dùng tham số type trong phương thức add_argument(). Tất cả kiểu dữ liệu Python là giá trị hợp lệ của type.
import argparse
parser = argparse.ArgumentParser(description="add numbers")
parser.add_argument("first", type=int)
parser.add_argument("second", type=int)
args = parser.parse_args()
x = args.first
y = args.second
z = x + y
print('addition of {} and {} = {}'.format(x, y, z))
C:\python36>python argparser2.py 2 3
addition of 2 and 3 = 5Trong các ví dụ trên, các đối số là bắt buộc. Để thêm đối số tùy chọn, thêm tiền tố tên của nó bằng hai gạch ngang --. Trong trường hợp sau đối số surname là tùy chọn vì nó có tiền tố bằng hai gạch ngang (--surname).
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument("--surname")
args = parser.parse_args()
print("My name is ", args.name, end=' ')
if args.surname:
print(args.surname)Một tên đối số một chữ cái có tiền tố bằng gạch ngang đơn hoạt động như tùy chọn tên ngắn.
C:\python36>python argparser3.py Malhar
My name is Malhar
C:\python36>python argparser3.py Malhar --surname Lathkar
My name is Malhar Lathkar
parser.add_argument("-s", "--surname")Nếu mong muốn một đối số chỉ nhận giá trị từ danh sách định nghĩa, nó được định nghĩa làm tham số choices.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("sub", choices=['Physics', 'Maths', 'Biology'])
args = parser.parse_args()
print("My subject is ", args.sub)Lưu ý nếu giá trị tham số không từ danh sách, lỗi lựa chọn không hợp lệ được hiển thị.
C:\python36>python argparser4.py Physics
My subject is Physics
C:\python36>python argparser4.py English
usage: argparser4.py [-h] {Physics,Maths,Biology}
argparser4.py: error: argument sub: invalid choice: 'English' (choose from 'Physics', 'Maths', 'Biology')