ต้องการตัวอย่างอาร์กิวเมนต์แบบง่าย: 1 อาร์กิวเมนต์, 3 ผลลัพธ์


529

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


15
จากนั้นเพียงตรวจสอบsys.argvข้อโต้แย้งที่คุณต้องการ ...
JBernardo

10
เคยพยายามอวยชัย ? มันเป็นเรื่องง่ายที่จะใช้กระดาษห่อมากกว่า argparse กับเอกสารที่ดี
kirbyfan64sos

157
มันไม่ใช่คุณ. มันเถียง มันกำลังพยายามพาคุณเดินทางไปยังดวงดาวและไม่สนใจว่าคุณจะมุ่งหน้าไปทางไหน
Florian Heigl

11
API "pythonic" บ้าอีกครั้ง: /
mlvljr

69
ให้ศีลคุณด้าน wilkie สำหรับการยืนขึ้นสำหรับสมองเริ่มต้นเล็ก ๆ ทุกที่
polka

คำตอบ:


255

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

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a")
args = parser.parse_args()

if args.a == 'magic.name':
    print 'You nailed it!'

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

...
parser.add_argument("a", nargs='?', default="check_string_for_empty")
...
if args.a == 'check_string_for_empty':
    print 'I can tell that no argument was given and I can deal with that here.'
elif args.a == 'magic.name':
    print 'You nailed it!'
else:
    print args.a

อาจมีวิธีแก้ปัญหาที่สง่างามกว่า แต่ก็ใช้งานได้และเรียบง่าย


4
หลังจากไตร่ตรองมาสักพักฉันก็สรุปคำถามนี้จริง ๆ แล้วตอบคำถามที่ดีที่สุดตามที่ถามและสถานการณ์ที่ฉันอยู่ในขณะนั้น คำตอบที่ยอดเยี่ยมอื่น ๆ ได้รวบรวมตัวแทนมากกว่าเพียงพอที่จะพิสูจน์คุณค่าของพวกเขาและสามารถยืนแข่งขันน้อย :-)
matt wilkie

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

363

นี่คือวิธีที่ฉันทำกับargparse(มีหลาย args):

parser = argparse.ArgumentParser(description='Description of your program')
parser.add_argument('-f','--foo', help='Description for foo argument', required=True)
parser.add_argument('-b','--bar', help='Description for bar argument', required=True)
args = vars(parser.parse_args())

args จะเป็นพจนานุกรมที่มีอาร์กิวเมนต์:

if args['foo'] == 'Hello':
    # code here

if args['bar'] == 'World':
    # code here

ในกรณีของคุณเพียงแค่เพิ่มอาร์กิวเมนต์เดียวเท่านั้น


3
ดังที่ได้กล่าวไว้ในความคิดเห็นของฉันต่อคำตอบอื่น ๆ ฉันต้องการเก็บการจัดรูปแบบความช่วยเหลืออัตโนมัติของ argparse แต่ดูเหมือนจะไม่มีตัวเลือกในการโต้แย้งแบบไม่มีชื่อ (มีแนวโน้มที่ฉันจะไม่เข้าใจเมื่อฉันเห็น ), เช่นหนึ่งต้องทำfoo.py --action installหรือfoo.py --action removeแทนที่ง่ายๆfoo.py install
matt wilkie

7
@mattwilkie แล้วคุณจะต้องกำหนดตำแหน่งโต้แย้งเช่นนี้ parser.add_argument('install', help='Install the app') (Notice คุณไม่สามารถกำหนดตำแหน่งการโต้แย้งด้วยrequired=True)
ดิเอโกวา

32
ในฐานะที่เป็น Noob เพื่อ argparse คำตอบนี้จริงๆช่วยเพราะผมไม่ทราบว่าจะหาตัวเลือกหลังจากที่พวกเขาได้ผ่าน กล่าวอีกนัยหนึ่งฉันต้องเข้าใจว่าการargsสร้างพจน์ดังกล่าวข้างต้นได้อย่างไร
mrKelley

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

17
โดยส่วนตัวแล้วฉันคิดว่าการเข้าถึงอาร์กิวเมนต์เป็นเรื่องง่ายกว่าargs.fooและargs.barแทนที่จะเป็นไวยากรณ์ของพจนานุกรม แน่นอนว่าไม่ว่าจะด้วยวิธีใด แต่ args ไม่ใช่พจนานุกรม แต่เป็นargparse.Namespaceวัตถุ
Michael Mior

210

argparseเอกสารที่ดีพอสมควร แต่ใบออกรายละเอียดที่มีประโยชน์น้อยซึ่งอาจจะไม่ชัดเจน (@Diego Navarro พูดถึงบางอย่างแล้ว แต่ฉันจะพยายามขยายคำตอบของเขาเล็กน้อย) การใช้งานพื้นฐานมีดังนี้:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--my-foo', default='foobar')
parser.add_argument('-b', '--bar-value', default=3.14)
args = parser.parse_args()

วัตถุที่คุณได้รับกลับมาจากparse_args()วัตถุ 'Namespace': วัตถุที่มีตัวแปรสมาชิกถูกตั้งชื่อหลังจากอาร์กิวเมนต์บรรทัดคำสั่งของคุณ Namespaceวัตถุเป็นวิธีที่คุณเข้าถึงข้อโต้แย้งและค่านิยมที่เกี่ยวข้องกับพวกเขาของคุณ:

args = parser.parse_args()
print args.my_foo
print args.bar_value

(โปรดสังเกตว่า argparseแทนที่ '-' ในชื่ออาร์กิวเมนต์ของคุณด้วยเครื่องหมายขีดล่างเมื่อตั้งชื่อตัวแปร)

ในหลาย ๆ สถานการณ์คุณอาจต้องการใช้การโต้แย้งแบบง่ายๆเช่นเดียวกับค่าสถานะซึ่งไม่มีค่า คุณสามารถเพิ่มสิ่งเหล่านี้ในการโต้แย้งแบบนี้:

parser.add_argument('--foo', action='store_true')
parser.add_argument('--no-foo', action='store_false')

ด้านบนจะสร้างตัวแปรที่ชื่อว่า 'foo' ด้วยค่า True และ 'no_foo' ด้วยค่า False ตามลำดับ:

if (args.foo):
    print "foo is true"

if (args.no_foo is False):
    print "nofoo is false"

โปรดทราบว่าคุณสามารถใช้ตัวเลือก "จำเป็น" เมื่อเพิ่มอาร์กิวเมนต์:

parser.add_argument('-o', '--output', required=True)

ด้วยวิธีนี้หากคุณละเว้นอาร์กิวเมนต์นี้ที่บรรทัดคำสั่งargparseจะบอกคุณว่ามันหายไปและหยุดการทำงานของสคริปต์ของคุณ

สุดท้ายทราบว่าเป็นไปได้ที่จะสร้างโครงสร้าง dict ของข้อโต้แย้งของคุณโดยใช้varsฟังก์ชั่นถ้ามันทำให้ชีวิตง่ายขึ้นสำหรับคุณ

args = parser.parse_args()
argsdict = vars(args)
print argsdict['my_foo']
print argsdict['bar_value']

อย่างที่คุณเห็นvarsส่งกลับค่าพจน์ที่มีชื่ออาร์กิวเมนต์เป็นคีย์และค่าของมันเป็นเอ่อค่า

มีตัวเลือกและสิ่งอื่น ๆ อีกมากมายที่คุณสามารถทำได้ แต่สิ่งนี้ควรครอบคลุมสถานการณ์การใช้งานทั่วไปที่สำคัญที่สุด


3
จุดประสงค์ของ'-f'และ'-b'คืออะไร ทำไมคุณไม่ข้ามสิ่งนี้
2763361

13
เป็นเรื่องธรรมดาที่จะมีทั้ง 'รูปแบบย่อ' (หนึ่งขีด) และ 'รูปแบบยาว' (สองขีดกลาง) สำหรับตัวเลือกรันไทม์แต่ละตัว คุณจะเห็นสิ่งนี้ตัวอย่างเช่นในเกือบทุกยูทิลิตี้ Unix / Linux มาตรฐาน ทำman cpหรือman lsและคุณจะพบว่าตัวเลือกมากมายมาในทั้งสองรสชาติ (เช่น-f, --force) อาจมีเหตุผลที่แตกต่างกันอย่างกว้างขวางว่าทำไมคนถึงชอบ แต่อย่างใด แต่ในกรณีใด ๆ มันเป็นเรื่องธรรมดาที่จะทำให้ทั้งสองรูปแบบมีอยู่ในโปรแกรมของคุณ
DMH

59

แมตต์ถามเกี่ยวกับพารามิเตอร์ตำแหน่งในการโต้แย้งและฉันเห็นด้วยว่าเอกสาร Python ขาดในด้านนี้ ไม่มีตัวอย่างที่สมบูรณ์เดียวในหน้าคี่ ~ 20 ที่แสดงทั้งการแยกวิเคราะห์และการใช้พารามิเตอร์ตำแหน่งแยกและการใช้พารามิเตอร์ตำแหน่ง

ไม่มีคำตอบอื่นใดที่นี่แสดงตัวอย่างที่สมบูรณ์ของพารามิเตอร์ตำแหน่งดังนั้นนี่เป็นตัวอย่างที่สมบูรณ์:

# tested with python 2.7.1
import argparse

parser = argparse.ArgumentParser(description="An argparse example")

parser.add_argument('action', help='The action to take (e.g. install, remove, etc.)')
parser.add_argument('foo-bar', help='Hyphens are cumbersome in positional arguments')

args = parser.parse_args()

if args.action == "install":
    print("You asked for installation")
else:
    print("You asked for something other than installation")

# The following do not work:
# print(args.foo-bar)
# print(args.foo_bar)

# But this works:
print(getattr(args, 'foo-bar'))

สิ่งที่ขว้างฉันออกไปก็คือ argparse จะแปลงอาร์กิวเมนต์ชื่อ "--foo-bar" เป็น "foo_bar" แต่พารามิเตอร์ตำแหน่งที่ชื่อว่า "foo-bar" ยังคงเป็น "foo-bar" ทำให้ชัดเจนน้อยลงวิธีการ ใช้ในโปรแกรมของคุณ

สังเกตุทั้งสองบรรทัดใกล้ถึงจุดสิ้นสุดของตัวอย่างของฉัน - ทั้งคู่จะไม่ทำงานเพื่อให้ได้ค่าของพารามิเตอร์ตำแหน่ง foo-bar เห็นได้ชัดว่าคนแรกผิด (เป็นนิพจน์ทางคณิตศาสตร์ args.foo ลบด้วยบาร์) แต่อันที่สองไม่ได้ผล:

AttributeError: 'Namespace' object has no attribute 'foo_bar'

หากคุณต้องการใช้แอfoo-barททริบิวคุณต้องใช้getattrดังที่เห็นในบรรทัดสุดท้ายของตัวอย่าง สิ่งที่บ้าคือถ้าคุณพยายามใช้dest=foo_barเพื่อเปลี่ยนชื่อคุณสมบัติเป็นสิ่งที่เข้าถึงได้ง่ายขึ้นคุณจะได้รับข้อความแสดงข้อผิดพลาดที่แปลกประหลาดจริงๆ:

ValueError: dest supplied twice for positional argument

นี่คือวิธีที่ตัวอย่างข้างต้นทำงาน:

$ python test.py
usage: test.py [-h] action foo-bar
test.py: error: too few arguments

$ python test.py -h
usage: test.py [-h] action foo-bar

An argparse example

positional arguments:
  action      The action to take (e.g. install, remove, etc.)
  foo-bar     Hyphens are cumbersome in positional arguments

optional arguments:
  -h, --help  show this help message and exit

$ python test.py install foo
You asked for installation
foo

5
nargs='?'คือคาถาสำหรับ "ตำแหน่งทางเลือก" ตามstackoverflow.com/questions/4480075// …
MarkHu

ความจริงที่ว่าตำแหน่งfoo-barไม่ได้เปลี่ยนไปfoo_barมีการแก้ไขในbugs.python.org/issue15125
hpaulj

2
ฉันคิดว่าวิธีแก้ไขปัญหาที่ง่ายกว่าสำหรับข้อผิดพลาดนี้คือเพียงเรียกอาร์กิวเมนต์ "foo_bar" แทน "foo-bar" จากนั้นใช้print args.foo_barงานได้ เนื่องจากเป็นอาร์กิวเมนต์ตำแหน่งคุณไม่จำเป็นต้องระบุชื่อเมื่อเรียกใช้สคริปต์ดังนั้นจึงไม่สำคัญสำหรับผู้ใช้
แนะนำ

@luator คุณพูดถูกมันเป็นเรื่องง่ายที่จะเปลี่ยนชื่ออาร์กิวเมนต์ แต่ผู้เขียนรายงานข้อผิดพลาดทำให้เป็นกรณีที่ดีว่านี่ยังคงเป็นความผิดพลาดเพราะภาระการรับรู้ที่ไม่จำเป็น เมื่อใช้ argparse เราต้องหยุดชั่วคราวและเรียกคืนข้อกำหนดการตั้งชื่อที่แตกต่างกันสำหรับตัวเลือกและอาร์กิวเมนต์ ดูbugs.python.org/msg164968
Mark E. Haase

1
@ mehaase ฉันเห็นด้วยอย่างยิ่งว่านี่เป็นความผิดพลาดที่ควรได้รับการแก้ไข ฉันแค่คิดว่าการเปลี่ยนชื่ออาร์กิวเมนต์เป็นวิธีแก้ปัญหาที่ง่ายและสับสนน้อยกว่าการใช้getattr(มันมีความยืดหยุ่นมากกว่าเพราะช่วยให้คุณเปลี่ยนอาร์กิวเมนต์จากตัวเลือกเป็นตำแหน่งโดยไม่ต้องเปลี่ยนรหัสที่ใช้ค่า)
ยืม

22

อีกหนึ่งบทสรุปที่ได้แรงบันดาลใจจากโพสต์นี้

import argparse

# define functions, classes, etc.

# executes when your script is called from the command-line
if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    #
    # define each option with: parser.add_argument
    #
    args = parser.parse_args() # automatically looks at sys.argv
    #
    # access results with: args.argumentName
    #

อาร์กิวเมนต์ถูกกำหนดด้วยชุดค่าผสมต่อไปนี้:

parser.add_argument( 'name', options... )              # positional argument
parser.add_argument( '-x', options... )                # single-char flag
parser.add_argument( '-x', '--long-name', options... ) # flag with long name

ตัวเลือกทั่วไปคือ:

  • ช่วย : คำอธิบายสำหรับ arg นี้เมื่อ--helpใช้
  • เริ่มต้น : ค่าเริ่มต้นถ้าหาเรื่องจะถูกละเว้น
  • พิมพ์ : หากคุณคาดหวังfloatหรือint(เป็นอย่างอื่นstr)
  • ปลายทาง : ให้ชื่ออื่นกับธง (เช่น'-x', '--long-name', dest='longName')
    หมายเหตุ: โดยค่าเริ่มต้น--long-nameจะสามารถเข้าถึงได้ด้วยargs.long_name
  • การกระทำ : สำหรับการจัดการพิเศษของข้อโต้แย้งบางอย่าง
    • store_true, store_false:สำหรับ boolean args
      '--foo', action='store_true' => args.foo == True
    • store_const:ที่จะใช้กับตัวเลือกconst
      '--foo', action='store_const', const=42 => args.foo == 42
    • count:สำหรับตัวเลือกซ้ำ ๆ เช่นเดียวกับใน./myscript.py -vv
      '-v', action='count' => args.v == 2
    • append:สำหรับตัวเลือกซ้ำ ๆ เช่นเดียวกับใน./myscript.py --foo 1 --foo 2
      '--foo', action='append' => args.foo == ['1', '2']
  • จำเป็นต้องใช้ : หากจำเป็นต้องมีการตั้งค่าสถานะหรืออาร์กิวเมนต์ตำแหน่งไม่ได้
  • nargs : สำหรับการตั้งค่าสถานะเพื่อจับ N args
    ./myscript.py --foo a b => args.foo = ['a', 'b']
  • ตัวเลือก : เพื่อ จำกัด อินพุตที่เป็นไปได้ (ระบุว่าเป็นรายการสตริงหรือ ints if type=int)

12

หมายเหตุการสอน Argparseในหลาม HOWTOs มันเริ่มจากตัวอย่างพื้นฐานส่วนใหญ่เช่นนี้:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
args = parser.parse_args()
print(args.square**2)

และพัฒนาไปสู่พื้นฐานที่น้อยกว่า

มีตัวอย่างพร้อมตัวเลือกที่กำหนดไว้ล่วงหน้าสำหรับตัวเลือกเช่นเดียวกับสิ่งที่ถูกถาม:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)

ยินดีที่ได้เห็นว่าเอกสารได้รับการอัปเดตแล้ว ฉันขอยืนยันว่านี่ไม่ใช่กรณีที่ OP ได้โพสต์คำถามเมื่อ 5 ปีที่แล้ว
ntwrkguru

10

นี่คือสิ่งที่ฉันคิดขึ้นมาในโครงการเรียนรู้ของฉันขอบคุณ @DMH ส่วนใหญ่ ...

รหัสตัวอย่าง:

import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-f', '--flag', action='store_true', default=False)  # can 'store_false' for no-xxx flags
    parser.add_argument('-r', '--reqd', required=True)
    parser.add_argument('-o', '--opt', default='fallback')
    parser.add_argument('arg', nargs='*') # use '+' for 1 or more args (instead of 0 or more)
    parsed = parser.parse_args()
    # NOTE: args with '-' have it replaced with '_'
    print('Result:',  vars(parsed))
    print('parsed.reqd:', parsed.reqd)

if __name__ == "__main__":
    main()

สิ่งนี้อาจมีการพัฒนาและพร้อมใช้งานออนไลน์: command-line.py

สคริปต์เพื่อให้รหัสนี้ออกกำลังกาย: command-line-demo.sh


2
ในที่สุดก็เป็นตัวอย่างโต้แย้งที่ทำให้รู้สึก
opentokix

5

คุณสามารถใช้plac (wrapper รอบ ๆargparse)

โบนัสจะสร้างคำแนะนำช่วยเหลืออย่างเป็นระเบียบ - ดูด้านล่าง

สคริปต์ตัวอย่าง:

#!/usr/bin/env python3
def main(
    arg: ('Argument with two possible values', 'positional', None, None, ['A', 'B'])
):
    """General help for application"""
    if arg == 'A':
        print("Argument has value A")
    elif arg == 'B':
        print("Argument has value B")

if __name__ == '__main__':
    import plac
    plac.call(main)

ตัวอย่างผลลัพธ์:

ไม่มีข้อโต้แย้งใด ๆ - example.py :

usage: example.py [-h] {A,B}
example.py: error: the following arguments are required: arg

มีการโต้แย้งที่ไม่คาดคิด - example.py C :

usage: example.py [-h] {A,B}
example.py: error: argument arg: invalid choice: 'C' (choose from 'A', 'B')

อาร์กิวเมนต์ที่ถูกต้องให้มาด้วย - example.py A :

Argument has value A

เมนูช่วยเหลือเต็มรูปแบบ (สร้างโดยอัตโนมัติ) - example.py -h :

usage: example.py [-h] {A,B}

General help for application

positional arguments:
  {A,B}       Argument with two possible values

optional arguments:
  -h, --help  show this help message and exit

คำอธิบายสั้น ๆ :

ชื่อของอาร์กิวเมนต์มักจะเท่ากับชื่อพารามิเตอร์ ( arg)

คำอธิบายประกอบ tuple หลังจากargพารามิเตอร์มีความหมายต่อไปนี้:

  • คำอธิบาย ( Argument with two possible values)
  • ประเภทของอาร์กิวเมนต์ - หนึ่งใน 'ค่าสถานะ', 'ตัวเลือก' หรือ 'ตำแหน่ง' ( positional)
  • ตัวย่อ ( None)
  • ประเภทของค่าอาร์กิวเมนต์ - เช่น ลอยสตริง ( None)
  • ชุดตัวเลือกที่ จำกัด ( ['A', 'B'])

เอกสารอ้างอิง:

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการใช้อวยชัยตรวจสอบเอกสารที่ดี:

Plac: การแจงบรรทัดคำสั่งอย่างง่าย


4

หากต้องการเพิ่มสิ่งที่ผู้อื่นระบุ:

ฉันมักจะต้องการใช้พารามิเตอร์ 'ปลายทาง' เพื่อระบุชื่อตัวแปรแล้วใช้ 'globals (). update ()' เพื่อวางตัวแปรเหล่านั้นในเนมสเปซส่วนกลาง

การใช้งาน:

$ python script.py -i "Hello, World!"

รหัส:

...
parser.add_argument('-i', '--input', ..., dest='inputted_variable',...)
globals().update(vars(parser.parse_args()))
...
print(inputted_variable) # Prints "Hello, World!"

argparseใช้ภายในgetattrและsetattrเพื่อเข้าถึงค่าในเนมสเปซ ด้วยวิธีนี้มันไม่ได้ถูกรบกวนจากdestค่าที่เกิดขึ้นอย่างผิดปกติ
hpaulj

1

วิธีง่ายๆในการใช้ argparse และแก้ไขสวิตช์ '-h' / '--help' เพื่อแสดงคำแนะนำวิธีใช้โค้ดส่วนบุคคลของคุณเองคือการตั้งค่าความช่วยเหลือเริ่มต้นเป็น False คุณยังสามารถเพิ่ม .add_arguments เพิ่มเติมได้มากเท่าที่คุณต้องการ :

import argparse

parser = argparse.ArgumentParser(add_help=False)

parser.add_argument('-h', '--help', action='help',
                help='To run this script please provide two arguments')
parser.parse_args()

เรียกใช้: python test.py -h

เอาท์พุท:

usage: test.py [-h]

optional arguments:
  -h, --help  To run this script please provide two arguments

-1

คำตอบที่ง่ายที่สุด!

ป.ล. ผู้ที่เขียนเอกสารของการโต้แย้งเป็นคนโง่

รหัสหลาม:

import argparse
parser = argparse.ArgumentParser(description='')
parser.add_argument('--o_dct_fname',type=str)
parser.add_argument('--tp',type=str)
parser.add_argument('--new_res_set',type=int)
args = parser.parse_args()
o_dct_fname = args.o_dct_fname
tp = args.tp
new_res_set = args.new_res_set

รหัสเรียกใช้

python produce_result.py --o_dct_fname o_dct --tp father_child --new_res_set 1

คำตอบนี้ไม่ได้เพิ่มอะไรใหม่ / แตกต่างจากคำตอบที่มีอยู่
NVS Abhilash

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