参数Parser Python条件要求

Adn*_*nan 4 python argparse

我有一个Python程序,它维护一个联系人列表,我希望它通过命令行支持以下选项:

  1. --show ,接受一个字符串参数
  2. --list,不论证
  3. --add,接受一个字符串参数
  4. --number,接受一个int参数
  5. --email,接受一个字符串参数

我需要的是:

prog [--show xyz | --list | --add xyz --number 123 --email abcd@xyz.com ]
Run Code Online (Sandbox Code Playgroud)

我尝试使用subparsers实现它,如下所示:

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

subparser1 = subparsers.add_parser('1')
subparser1.add_argument('--show', type=str, help="Shows the contact based on the given name provided as argument")
subparser1.add_argument('--list', action='store_true', help= "Prints all the contacts")

subparser2 = subparsers.add_parser('2')

subparser2.add_argument('--add', type=str, help="Adds a new contact by this name",required=True)
subparser2.add_argument('--number', type=int, help="The Phone Number for the new contact",required=True)
subparser2.add_argument('--email', type=str, help="Email address for the new contact",required=True)
Run Code Online (Sandbox Code Playgroud)

问题是我不想通过命令行提供我想要使用的subparser的编号/名称.

例如:

prog.py 1 --list
prog.py 2 --add xyz --number 1234 --email abc@xyz.com

我试图使它与mutual_exclusive_group一起工作,但不能.这种用法有办法吗?

Léo*_*din 5

--在命令之前你真的需要双短划线()吗?如果没有,你可以这样做:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='command')

show_subparser = subparsers.add_parser('show')
show_subparser.add_argument('name', type=str)

list_subparser = subparsers.add_parser('list')

add_subparser = subparsers.add_parser('add')
add_subparser.add_argument('phone', type=int)

args = parser.parse_args()

# Do something with your args
print args
Run Code Online (Sandbox Code Playgroud)

这会限制您使用上面定义的参数.因为你可以做任何prog show xyzprog add 123,但你不能这样做prog show xzy add 123.