บ่อยครั้งที่เราต้องส่งอาร์กิวเมนต์ไปยังสคริปต์ 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')