Notes & software courses · Free to learn
Aph's Blog
On this page

สร้าง CLI ด้วย argparse

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

ทำสคริปต์ให้รับ argument จาก command line อย่างมืออาชีพ พร้อม --help อัตโนมัติ

สคริปต์ที่ดีควรรับค่าจากผู้ใช้ผ่าน command line ได้ เช่น python tool.py data.txt --verbose โมดูล argparse ช่วยจัดการ argument ให้เรียบร้อย พร้อมสร้างข้อความ help และตรวจชนิดข้อมูลให้อัตโนมัติ

sys.argv — วิธีดิบ

ก่อนรู้จัก argparse ลองดูวิธีดิบ: sys.argv คือ list ของ argument ที่ส่งมา (ตัวแรกคือชื่อไฟล์) — ใช้ได้แต่ต้องจัดการเองทุกอย่าง

python
import sys
print(sys.argv)        # ['tool.py', 'data.txt', '--verbose']
# ต้องเช็คจำนวน, แปลงชนิด, ทำ help เองทั้งหมด — ยุ่งยาก

argparse — วิธีที่ใช้จริง

python
import argparse

parser = argparse.ArgumentParser(description="นับคำในไฟล์")
parser.add_argument("filename", help="ไฟล์ที่จะอ่าน")          # positional
parser.add_argument("--upper", action="store_true", help="แปลงเป็นตัวใหญ่")  # flag
parser.add_argument("--repeat", type=int, default=1, help="ทำซ้ำกี่ครั้ง")   # มีค่า + ชนิด

args = parser.parse_args()
print(args.filename)   # ค่าที่รับมา
print(args.upper)      # True/False
print(args.repeat)     # int
bash
python tool.py data.txt --upper --repeat 3
# args.filename = 'data.txt', args.upper = True, args.repeat = 3

--help ได้มาฟรี

argparse สร้าง --help ให้อัตโนมัติจากที่เราระบุ และตรวจชนิด/argument ที่ขาดให้ด้วย

bash
python tool.py --help
# usage: tool.py [-h] [--upper] [--repeat REPEAT] filename
#
# นับคำในไฟล์
# positional arguments:
#   filename     ไฟล์ที่จะอ่าน
# options:
#   --upper      แปลงเป็นตัวใหญ่
#   --repeat     ทำซ้ำกี่ครั้ง
ประเภท argument

positional (เช่น filename) จำเป็นต้องใส่และเรียงตามตำแหน่ง; optional (ขึ้นต้น --) ใส่หรือไม่ก็ได้; flag (action="store_true") เป็น True เมื่อใส่ False เมื่อไม่ใส่ — argparse จัดการ validate ชนิดและความครบให้หมด

สรุปหัวข้อนี้

  • sys.argv คือ list ของ argument ดิบ — ใช้ได้แต่จัดการเองทุกอย่าง
  • argparse: add_argument กำหนด positional / optional (--) / flag
  • type= ตรวจชนิด, default= ค่าเริ่มต้น, action="store_true" ทำ flag
  • ได้ --help และการ validate มาฟรี
แบบฝึกหัด

1) เขียน CLI ที่รับชื่อไฟล์แล้วนับจำนวนบรรทัด 2) เพิ่ม flag --words เพื่อนับคำแทนบรรทัด 3) เพิ่ม --repeat type=int แล้วทำงานซ้ำตามจำนวน 4) รัน --help ดูข้อความที่ argparse สร้างให้