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

การแยกวิเคราะห์อาร์กิวเมนต์ใน Python


ภาษาการเขียนโปรแกรมทุกภาษามีคุณสมบัติในการสร้างสคริปต์และเรียกใช้จากเทอร์มินัลหรือถูกเรียกโดยโปรแกรมอื่น เมื่อเรียกใช้สคริปต์ดังกล่าว เรามักจะต้องส่งต่ออาร์กิวเมนต์ที่จำเป็นสำหรับสคริปต์สำหรับฟังก์ชันต่างๆ ที่จะดำเนินการภายในสคริปต์ ในบทความนี้เราจะมาดูกันว่ามีวิธีใดบ้างในการส่งผ่านอาร์กิวเมนต์ไปยังสคริปต์หลาม

การใช้ sys.argv

นี่คือโมดูล inbuilt sys.argv สามารถประมวลผลอาร์กิวเมนต์ที่ส่งต่อด้วยสคริปต์ โดยค่าเริ่มต้น อาร์กิวเมนต์แรกที่พิจารณาที่ sys.argv[0] คือชื่อไฟล์ อาร์กิวเมนต์ที่เหลือจะถูกสร้างดัชนีเป็น 1,2 เป็นต้น ในตัวอย่างด้านล่าง เราจะเห็นว่าสคริปต์ใช้อาร์กิวเมนต์ที่ส่งผ่านไปยังสคริปต์อย่างไร

import sys
print(sys.argv[0])
print("Hello ",sys.argv[1],", welcome!")

เราทำตามขั้นตอนด้านล่างเพื่อเรียกใช้สคริปต์ด้านบนและได้ผลลัพธ์ดังต่อไปนี้:

ในการเรียกใช้โค้ดข้างต้น ให้ไปที่หน้าต่างเทอร์มินัลแล้วเขียนคำสั่งที่แสดงด้านล่าง ที่นี่ชื่อของสคริปต์คือ args_demo.py เราส่งข้อโต้แย้งที่มีค่า Samantha ไปยังสคริปต์นี้

D:\Pythons\py3projects>python3 args_demo.py Samantha
args_demo.py
Hello Samantha welcome!

การใช้ getopt

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

ตัวอย่าง

import getopt
import sys

# Remove the first argument( the filename)
all_args = sys.argv[1:]
prod = 1

try:
   # Gather the arguments
   opts, arg = getopt.getopt(all_args, 'x:y:')
   # Should have exactly two options
   if len(opts) != 2:
      print ('usage: args_demo.py -x <first_value> -b <second_value>')
   else:
      # Iterate over the options and values
      for opt, arg_val in opts:
         prod *= int(arg_val)
      print('Product of the two numbers is {}'.format(prod))

except getopt.GetoptError:
   print ('usage: args_demo.py -a <first_value> -b <second_value>')
   sys.exit(2)

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

D:\Pythons\py3projects >python3 args_demo.py -x 3 -y 12
Product of the two numbers is 36
# Next Run
D:\Pythons\py3projects >python3 args_demo.py
usage: args_demo.py -x <first_value> -b <second_value>

การใช้ argparse

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

ตัวอย่าง

import argparse

# Construct an argument parser
all_args = argparse.ArgumentParser()

# Add arguments to the parser
all_args.add_argument("-x", "--Value1", required=True,
   help="first Value")
all_args.add_argument("-y", "--Value2", required=True,
   help="second Value")
args = vars(all_args.parse_args())

# Find the product
print("Product is {}".format(int(args['Value1']) * int(args['Value2'])))

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

D:\Pythons\py3projects>python3 args_demo.py -x 3 -y 21
Product is 63
# Next Run
D:\Pythons\py3projects>python3 args_demo.py -x 3 -y
usage: args_demo.py [-h] -x VALUE1 -y VALUE2
args_demo.py: error: argument -y/--Value2: expected one argument