Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ตัวแยกวิเคราะห์ตัวเลือกบรรทัดคำสั่ง Python (argparse)

บ่อยครั้งที่เราต้องส่งอาร์กิวเมนต์ไปยังสคริปต์ Python เมื่อรันจากบรรทัดคำสั่ง อย่างไรก็ตาม สคริปต์จะยกข้อยกเว้นเมื่อพารามิเตอร์ที่ต้องการไม่ได้ถูกให้มาในจำนวน ประเภท หรือลำดับที่เท่ากัน นั่นคือที่ที่ความจำเป็นในการแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งอย่างเหมาะสมเกิดขึ้น

โมดูล argparse ให้เครื่องมือสำหรับเขียนอินเทอร์เฟซบรรทัดคำสั่งที่ใช้งานง่ายมาก มันจัดการวิธีการแยกวิเคราะห์อาร์กิวเมนต์ที่รวบรวมในรายการ sys.argv สร้าง help อัตโนมัติ และออกข้อความข้อผิดพลาดเมื่อให้ตัวเลือกที่ไม่ถูกต้อง

ขั้นตอนแรกในการออกแบบอินเทอร์เฟซบรรทัดคำสั่งคือการตั้งค่าอ็อบเจ็กต์ parser ทำได้โดยฟังก์ชัน ArgumentParser() ในโมดูล argparse ฟังก์ชันนี้สามารถรับสตริงอธิบายเป็นพารามิเตอร์ description

เริ่มต้นกับสคริปต์ของเราที่จะรันจากบรรทัดคำสั่งโดยไม่มีอาร์กิวเมนต์ ยังคงใช้เมธอด parse_args() ของอ็อบเจ็กต์ parser ซึ่งไม่ทำอะไรเพราะไม่มีอาร์กิวเมนต์ให้:

import argparse
parser = argparse.ArgumentParser(description="sample argument parser")
args = parser.parse_args()

เมื่อรันสคริปต์ข้างต้น:

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

คำสั่งบรรทัดคำสั่งครั้งที่สองให้ตัวเลือก --help ซึ่งสร้างข้อความ help ตามที่แสดง ตัวพารามิเตอร์ --help พร้อมใช้งานโดยค่าเริ่มต้น

ตอนนี้ลองกำหนดอาร์กิวเมนต์ที่บังคับสำหรับสคริปต์ให้รัน และหากไม่ให้ควรโยนข้อผิดพลาด ที่นี่เรากำหนดอาร์กิวเมนต์ 'user' โดยเมธอด 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")

Help ของสคริปต์นี้ตอนนี้แสดงอาร์กิวเมนต์ตำแหน่ง (positional argument) หนึ่งในรูป 'user' โปรแกรมตรวจสอบว่าค่าของมันคือ 'Admin' หรือไม่ และพิมพ์ข้อความที่สอดคล้อง:

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

เราสามารถกำหนดค่า default ให้อาร์กิวเมนต์ในเมธอด 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")

ที่นี่ nargs คือจำนวนอาร์กิวเมนต์บรรทัดคำสั่งที่ควรจะถูกบริโภค '?' หนึ่งอาร์กิวเมนต์จะถูกบริโภคจากบรรทัดคำสั่งหากเป็นไปได้ และผลิตเป็นรายการเดียว หากไม่มีอาร์กิวเมนต์บรรทัดคำสั่ง ค่าจาก default จะถูกผลิต

C:\python36>python argparser1.py
Hello Admin
C:\python36>python argparser1.py Admin
Hello Admin
C:\python36>python argparser1.py test
Hello Guest

โดยค่าเริ่มต้น อาร์กิวเมนต์ทั้งหมดถูกจัดการเป็นสตริง เพื่อระบุ type ของอาร์กิวเมนต์อย่างชัดเจน ใช้พารามิเตอร์ type ในเมธอด add_argument() ชนิดข้อมูล Python ทั้งหมดเป็นค่าที่ถูกต้องของ 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 = 5

ในตัวอย่างข้างต้น อาร์กิวเมนต์เป็นบังคับ เพื่อเพิ่มอาร์กิวเมนต์ตัวเลือก ให้ขึ้นต้นชื่อด้วย double dash -- ในกรณีต่อไปนี้ อาร์กิวเมนต์ surname เป็นตัวเลือกเพราะขึ้นต้นด้วย double dash (--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)

ชื่อตัวอักษรเดียวของอาร์กิวเมนต์ขึ้นต้นด้วย single dash ทำหน้าที่เป็นตัวเลือกชื่อสั้น:

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")

หากต้องการให้อาร์กิวเมนต์มีค่าเฉพาะจากรายการที่กำหนด ให้กำหนดเป็นพารามิเตอร์ choices:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("sub", choices=['Physics', 'Maths', 'Biology'])
args = parser.parse_args()
print("My subject is ", args.sub)

สังเกตว่าหากค่าของพารามิเตอร์ไม่อยู่ในรายการ จะแสดงข้อผิดพลาด invalid choice:

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')