ฉันต้องการที่จะทราบว่าคำตอบก่อนหน้านี้ทำให้สมมติฐานมากมายเกี่ยวกับความรู้ของผู้ใช้ คำตอบนี้พยายามตอบคำถามในระดับการสอนเพิ่มเติม
สำหรับการเรียกใช้งานของ Python ทุกครั้งsys.argvจะมีรายการของสตริงที่แสดงถึงข้อโต้แย้งโดยอัตโนมัติ (ตามที่คั่นด้วยช่องว่าง) บนบรรทัดคำสั่ง ชื่อมาจากการประชุมการเขียนโปรแกรม Cซึ่ง argv และ argc แสดงถึงอาร์กิวเมนต์บรรทัดคำสั่ง
คุณจะต้องการเรียนรู้เพิ่มเติมเกี่ยวกับรายการและสตริงในขณะที่คุณกำลังคุ้นเคยกับ Python แต่ในระหว่างนี้นี่เป็นสิ่งที่ควรรู้
คุณสามารถสร้างสคริปต์ที่พิมพ์อาร์กิวเมนต์ตามที่แสดง นอกจากนี้ยังพิมพ์จำนวนอาร์กิวเมนต์โดยใช้lenฟังก์ชันในรายการ
from __future__ import print_function
import sys
print(sys.argv, len(sys.argv))
สคริปต์ต้องการ Python 2.6 หรือใหม่กว่า หากคุณเรียกใช้สคริปต์นี้print_args.pyคุณสามารถเรียกใช้พร้อมอาร์กิวเมนต์ที่แตกต่างกันเพื่อดูว่าเกิดอะไรขึ้น
> python print_args.py
['print_args.py'] 1
> python print_args.py foo and bar
['print_args.py', 'foo', 'and', 'bar'] 4
> python print_args.py "foo and bar"
['print_args.py', 'foo and bar'] 2
> python print_args.py "foo and bar" and baz
['print_args.py', 'foo and bar', 'and', 'baz'] 4
อย่างที่คุณเห็นอาร์กิวเมนต์บรรทัดคำสั่งมีชื่อสคริปต์ แต่ไม่ใช่ชื่อล่าม ในกรณีนี้ Python ให้สคริปต์เป็นไฟล์ที่เรียกใช้งานได้ หากคุณจำเป็นต้องรู้ชื่อของไฟล์ที่สามารถใช้งานsys.executableได้(ไพ ธ อนในกรณีนี้) คุณสามารถใช้
คุณสามารถดูได้จากตัวอย่างที่เป็นไปได้ที่จะรับอาร์กิวเมนต์ที่มีช่องว่างถ้าผู้ใช้เรียกใช้สคริปต์ด้วยอาร์กิวเมนต์ที่ใส่ในเครื่องหมายคำพูดดังนั้นสิ่งที่คุณได้รับคือรายการของอาร์กิวเมนต์ที่ผู้ใช้กำหนด
ตอนนี้ในรหัส Python ของคุณคุณสามารถใช้รายการสตริงนี้เป็นอินพุตของโปรแกรมของคุณ เนื่องจากรายการจะถูกจัดทำดัชนีโดยจำนวนเต็มตามศูนย์คุณสามารถรับแต่ละรายการโดยใช้รายการ [0] ตัวอย่างเช่นในการรับชื่อสคริปต์:
script_name = sys.argv[0] # this will always work.
แม้ว่าจะน่าสนใจ แต่คุณก็ไม่จำเป็นต้องรู้ชื่อสคริปต์ ในการรับอาร์กิวเมนต์แรกหลังสคริปต์สำหรับชื่อไฟล์คุณสามารถทำสิ่งต่อไปนี้:
filename = sys.argv[1]
นี่เป็นการใช้งานทั่วไป แต่โปรดทราบว่ามันจะล้มเหลวด้วย IndexError หากไม่มีการระบุอาร์กิวเมนต์
นอกจากนี้ Python ยังให้คุณอ้างอิงส่วนของรายการเพื่อรับรายการอาร์กิวเมนต์ที่ผู้ใช้ระบุ (แต่ไม่มีชื่อสคริปต์) คุณสามารถทำได้
user_args = sys.argv[1:] # get everything after the script name
นอกจากนี้ Python ช่วยให้คุณสามารถกำหนดลำดับของรายการ (รวมถึงรายการ) ให้กับชื่อตัวแปร ดังนั้นหากคุณคาดหวังให้ผู้ใช้ระบุอาร์กิวเมนต์สองตัวเสมอคุณสามารถกำหนดอาร์กิวเมนต์เหล่านั้น (เป็นสตริง) ให้กับตัวแปรสองตัว:
user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2
ดังนั้นเพื่อตอบคำถามเฉพาะของคุณsys.argv[1]แสดงถึงอาร์กิวเมนต์บรรทัดคำสั่งแรก (เป็น a string) ที่ส่งให้กับสคริปต์ที่เป็นปัญหา มันจะไม่พร้อมท์ให้ป้อนข้อมูล แต่จะล้มเหลวด้วย IndexError หากไม่มีการระบุอาร์กิวเมนต์บนบรรทัดคำสั่งตามชื่อสคริปต์