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

parser สไตล์ C สำหรับตัวเลือกบรรทัดคำสั่งใน Python


โมดูล sys ของ Python ให้การเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่งผ่าน sys.argv sys.argv คือรายการอาร์กิวเมนต์บรรทัดคำสั่ง และ sys.argv[0] คือโปรแกรม เช่น ชื่อสคริปต์

บันทึกโค้ดต่อไปนี้เป็น args.py

import sys
print ('argument list', sys.argv)

ดำเนินการสคริปต์ด้านบนจากบรรทัดคำสั่งดังนี้:

C:\python37>python args.py 11 22
argument list ['args.py', '11', '22']

โมดูล getopt มีฟังก์ชันแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งใน sys.argv รองรับแบบแผนเดียวกันกับฟังก์ชัน Unix getopt() (รวมถึงความหมายพิเศษของอาร์กิวเมนต์ในรูปแบบ '-' และ '--')

API ได้รับการออกแบบมาเพื่อให้ผู้ใช้ฟังก์ชัน C getopt() คุ้นเคย

getopt(args, shortopts, longopts=[])

แยกวิเคราะห์ตัวเลือกบรรทัดคำสั่งและรายการพารามิเตอร์ args เป็นรายการอาร์กิวเมนต์ที่ไม่รวม sys.argv[0] ซึ่งเป็นข้อมูลอ้างอิงชั้นนำของโปรแกรมที่ทำงานอยู่ โดยทั่วไป นี่หมายถึง sys.argv[1:] ข้อโต้แย้งของฟังก์ชันนี้มีดังต่อไปนี้ -

ทางลัด: เป็นสตริงของตัวอักษรตัวเลือกที่สคริปต์จะรู้จัก ตัวเลือกที่ต้องใช้อาร์กิวเมนต์จะตามด้วยโคลอน (':'; นั่นคือรูปแบบเดียวกับที่ Unix getopt() ใช้)

ลองออฟต์: หากระบุไว้ จะต้องเป็นรายการสตริงที่มีชื่ออ็อพชันแบบยาวซึ่งควรรองรับ ไม่ควรใส่อักขระ '-' นำหน้าในชื่อตัวเลือก ตัวเลือกยาวที่ต้องมีอาร์กิวเมนต์ควรตามด้วยเครื่องหมายเท่ากับ ('=')

ค่าตอบแทนประกอบด้วยสององค์ประกอบ:แรกคือรายการของคู่ (ตัวเลือก, ค่า); ที่สองคือรายการอาร์กิวเมนต์ของโปรแกรมที่เหลือหลังจากรายการตัวเลือกถูกถอดออก (นี่คือส่วนต่อท้ายของ args) คู่ตัวเลือกและมูลค่าแต่ละคู่ที่ส่งคืนมีตัวเลือกเป็นองค์ประกอบแรก นำหน้าด้วยยัติภังค์สำหรับตัวเลือกสั้น (เช่น '-x') หรือสองขีดกลางสำหรับตัวเลือกแบบยาว (เช่น '--long-option') และ อาร์กิวเมนต์ option เป็นองค์ประกอบที่สองหรือสตริงว่างหากตัวเลือกไม่มีอาร์กิวเมนต์ ตัวเลือกต่างๆ จะปรากฏในรายการในลำดับเดียวกันกับที่พบ ซึ่งทำให้เกิดได้หลายครั้ง ตัวเลือกยาวและสั้นอาจผสมกันได้

GetoptError ปรากฏขึ้นเมื่อพบตัวเลือกที่ไม่รู้จักในรายการอาร์กิวเมนต์ หรือเมื่อไม่มีตัวเลือกที่ต้องการอาร์กิวเมนต์

ตัวอย่าง

import sys, getopt

args=sys.argv[1:]
inputfile = ''
outputfile = ''
try:
   opts, args = getopt.getopt(args,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
   print ('test.py -i <inputfile> -o <outputfile>')
   sys.exit(2)
for opt, arg in opts:
   if opt == '-h':
      print ('args.py -i <inputfile> -o <outputfile>')
      sys.exit()
   elif opt in ("-i", "--ifile"):
      inputfile = arg
   elif opt in ("-o", "--ofile"):
      outputfile = arg
print ('Input file is "', inputfile)
print ('Output file is "', outputfile)

ผลลัพธ์

C:\python37>python args.py -h
args.py -i <inputfile> -o <outputfile>
C:\python37>python args.py -i abc.txt -o xyz.txt
Input file is " abc.txt
Output file is " xyz.txt
C:\python37>python args.py --ifile=abc.txt --ofile=xyz.txt
Input file is " abc.txt
Output file is " xyz.txt