Python argparse ตั้งค่าสถานะบรรทัดคำสั่งโดยไม่มีอาร์กิวเมนต์


345

ฉันจะเพิ่มการตั้งค่าสถานะทางเลือกให้กับบรรทัดคำสั่งของฉันได้อย่างไร

เช่น. ดังนั้นฉันสามารถเขียน

python myprog.py 

หรือ

python myprog.py -w

ฉันเหนื่อย

parser.add_argument('-w')

แต่ฉันเพิ่งได้รับข้อความแจ้งข้อผิดพลาดว่า

Usage [-w W]
error: argument -w: expected one argument

ซึ่งฉันใช้มันหมายความว่ามันต้องการค่าอาร์กิวเมนต์สำหรับตัวเลือก -w วิธีการเพียงแค่ยอมรับธงคืออะไร?

ฉันพบhttp://docs.python.org/library/argparse.htmlค่อนข้างทึบแสงสำหรับคำถามนี้


4
หากคุณต้องการให้ 1 สถานะสคริปต์ของคุณ sys.argv จะง่ายขึ้นมาก เว้นแต่ว่าคุณกำลังพยายามที่จะเรียนรู้การโต้เถียงเป็นพิเศษซึ่งเป็นสิ่งที่ดีเพราะมันเป็นโมดูลที่รู้ได้ง่าย
chown

2
แม้หลังจากที่ฉันรู้คำตอบแล้วตอนนี้ฉันก็ไม่เห็นว่าฉันจะเข้าใจมันได้อย่างไรจากเอกสาร
Andreas Haferburg

คำตอบ:


533

ในขณะที่คุณมีมันอาร์กิวเมนต์ w คาดหวังว่าค่าหลังจาก -w บนบรรทัดคำสั่ง หากคุณต้องการพลิกสวิทช์โดยการตั้งค่าตัวแปรTrueหรือFalseดูที่http://docs.python.org/dev/library/argparse.html#action (เฉพาะ store_true และ store_false)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

ที่หมายถึงaction='store_true'default=False

ตรงกันข้ามคุณอาจมีซึ่งหมายถึงaction='store_false'default=True


3
@Jdog ความคิดใด ๆ ว่าทำไมถึงไม่เหมาะกับฉัน อยู่เสมอw False
Iulian Onofrei

52

การเพิ่มโค้ดสั้น ๆ เพื่อให้พร้อมใช้งาน:

ที่มา: myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

การใช้งาน:

python myparser.py -w
>> True

-10

นี่เป็นวิธีที่รวดเร็วในการดำเนินการไม่ต้องการอะไรนอกเหนือจากsys.. แม้ว่าฟังก์ชันการทำงานจะถูก จำกัด :

flag = "--flag" in sys.argv[1:]

[1:] ในกรณีที่ชื่อไฟล์เต็มคือ --flag


13
เพิ่งเข้าสู่ระบบเพียงเพื่อแสดงให้เห็นว่าความคิดที่เลวร้ายนี้เกิดขึ้นในระยะยาวอย่างไร ลองนึกภาพว่าคุณเริ่มต้นด้วยการตรวจสอบว่าสตริง "--flag" อยู่ใน sys.argv จากนั้นคุณดูที่ท้าย sys.argv [-1] เพื่อดูไฟล์ที่จะเปิด ทันใดนั้นคุณก็จบลงด้วยสถานการณ์ที่ถ้าคุณพยายามเปิดไฟล์ชื่อ--flagมันจะทำงานอย่างกะทันหันและสิ่งที่แย่กว่านั้นคือสิ่งนี้มักจะจบลงด้วยการเป็นข้อบกพร่องด้านความปลอดภัยบนท้องถนนเมื่อข้อมูลที่ไม่น่าเชื่อถือกลายเป็น ส่งผ่านไปยัง argv ในที่สุดวิธีนี้ก็ไม่ควรทำ parsers หาเรื่องจริงเป็นเพียงไกลมีประสิทธิภาพมากขึ้น ...
timthelion

3
ดังที่ได้กล่าวมาแล้ววิธีการแก้ปัญหานี้ไม่ได้มีความแข็งแกร่งเลย แต่สามารถใช้งานได้หากคุณต้องการสิ่งนี้อย่างรวดเร็ว (เช่นสำหรับการทดสอบ) หลีกเลี่ยงรหัสการผลิตอย่างแน่นอน
Jonathan Sudiaman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.