Friday, March 09, 2007

จัดการกับ command line argument

เวลาเรียกใช้งานโปรแกรม การ parse ค่า parameter ต่างๆ มักจะเป็นเรื่องน่าปวดหัว ถึงขนาดว่าต้องมีตัวช่วยเช่น GNU getopt มาดูกันว่าใน Python จะง่ายขนาดไหนกับการอ่านค่า parameter ที่ส่งผ่านมาจาก command line

ใน Python มีหลายวิธีที่เราจะจัดการกับ command line argument หรือเรียกให้เท่ๆ ว่า argv (argument vector) โดยมีโมดูลหลายตัวที่จะทำให้เรายุ่งวุ่นวายกับ argv พวกนี้ได้ ตัวแรกที่เป็นพื้นฐานที่สุด คือโมดูล sys นี่เอง อีกตัวนึงที่มี feature หรูหราฟู่ฟ่าขึ้นมาหน่อย คือโมดูลชื่อ getopt ซึ่งจะคล้ายๆ กับ package getopt ของ GNU แต่การใช้งาน getopt ยังไม่ง่ายสมชื่อ Python เลยมีโมดูลชื่อ optparse ซึ่งออกแบบมาสำหรับการเรียกใช้งานโปรแกรมแบบ GNU/POSIX โดยเฉพาะ มาเริ่มใช้งานโมดูลตัวนี้กันเลยดีกว่า

เริ่มต้น ก็ต้อง import เข้ามาก่อนตามระเบียบ เพราะโมดูลใน Python มาในรูปของ Class
import optparse
parser = optparse.OptionParser()
ต่อจากนั้น ก็เริ่มทำงานได้ด้วยการเพิ่ม option ต่างๆ ที่เราต้องการเข้าไป เช่น
parser.add_option('-f','--file')
method นี้จะเป็นการเพิ่ม option เข้าไปใน parser object ของเรา สังเกตว่ามันจะ support ทั้ง argument แบบสั้น -f หรือแบบยาว --file เพื่อลูกเล่นที่หรูหรากว่าเดิม method add_option ยังมีของเล่นอีก
parser.add_option('-f','--file',action='store',type='string',dest='filename')
การกำหนดค่าต่างๆ สำหรับ add_option ก็คือการเพิ่มรายละเอียดเข้าไปในการ parse หา argument นั่นเอง action คือการกำหนดว่าหลังจาก parse เจออันนี้แล้ว ให้ทำอะไร ซึ่งค่าปริยายคือ store หรือให้เก็บค่าไว้ในตัวแปรตามชื่อที่เรากำหนดไว้ในส่วนของ dest

type เป็นการกำหนดประเภทของ argument โดย optparse จะแสดงข้อผิดพลาด หากมีการใส่ค่า argument ที่ไม่ตรงตามกฎ เช่นเรากำหนด type ให้เป็น int แต่ผู้ใช้ใส่ค่ามาเป็น string โมดูลก็จะแสดงข้อผิดพลาดออกไปให้

การจัดการกับ argument ที่เป็น boolean ก็สามารถทำได้ โดยการเปลี่ยน action เช่น
parser.add_option('-v','--verbose',action='store_true',dest='verbose')
ถ้า optparse เจอ -v หรือ --verbose ใน command line argument มันจะทำให้ตัวแปรชื่อ verbose มีค่าเป็น True ทันที

การกำหนดค่า default ก็ทำได้ง่ายๆ ด้วยการใส่ parameter default=xxx เข้าไปในส่วนของ method add_option และที่เด็ดสุดๆ ของ module ตัวนี้ คือการสร้าง help ให้เอง เพียงเราใส่ help='รายละเอียดการใช้งาน' เข้าไปเพิ่มในส่วนของ add_option เมื่อผู้ใช้พิมพ์คำสั่งตามด้วย -h มันก็จะแสดง help ออกมา ตัวอย่างคำสั่งแบบใส่ทุกอย่าง ก็จะดูคล้ายๆ แบบนี้
parser.add_option('-f','--file',action='store','dest='filename',default='/tmp/xxx',help='Specify file name')
หลังจากกำหนดค่า option ให้หมดแล้ว ก็ต้องเรียกตัว parser ให้ทำงาน ด้วยคำสั่งแบบนี้
(optlist, args) = parser.parse_args()
โมดูลก็จะจัดการ parse ค่าที่มาจาก command line ให้เราโดยเสร็จสรรพ ส่วนของ option (พวก -a -b -c หรือ --file อะไรทั้งหลาย) ก็จะถูกเก็บไว้ใน dictionary ชื่อ optlist และ argument ก็จะถูกเก็บไว้ใน list ชื่อ args นั่นเอง

This page is powered by Blogger. Isn't yours?

Subscribe to Posts [Atom]