當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python argparse.ArgumentParser.add_subparsers用法及代碼示例


用法:

ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, required][, help][, metavar])

許多程序將其函數拆分為多個sub-commands,例如,svn 程序可以像 svn checkoutsvn updatesvn commit 一樣調用 sub-commands。當程序執行需要不同類型命令行 參數的多個不同函數時,以這種方式拆分函數可能是一個特別好的主意。 ArgumentParser 支持使用 add_subparsers() 方法創建此類 sub-commands。 add_subparsers() 方法通常不帶參數調用,並返回一個特殊的操作對象。該對象有一個方法 add_parser() ,它接受一個命令名稱和任何 ArgumentParser 構造函數參數,並返回一個可以照常修改的 ArgumentParser 對象。

參數說明:

  • title - 幫助輸出中sub-parser 組的標題;默認情況下 “subcommands” 如果提供了說明,否則使用標題作為位置參數
  • description - 幫助輸出中sub-parser 組的說明,默認為None
  • prog - 將與sub-command 幫助一起顯示的使用信息,默認情況下是程序的名稱和子解析器參數之前的任何位置參數
  • parser_class - 用於創建 sub-parser 實例的類,默認為當前解析器的類(例如 ArgumentParser)
  • action - 在命令行遇到此參數時要采取的基本操作類型
  • dest - 將存儲 sub-command 名稱的屬性名稱;默認情況下 None 並且不存儲任何值
  • required - 默認情況下是否必須提供子命令 False(在 3.7 中添加)
  • help - 幫助輸出中sub-parser 組的幫助,默認為None
  • metavar - 在幫助中顯示可用的字符串 sub-commands;默認情況下它是 None 並以 {cmd1, cmd2, ..} 的形式呈現 sub-commands

一些示例用法:

>>> # create the top-level parser
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='sub-command help')
>>>
>>> # create the parser for the "a" command
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>>
>>> # create the parser for the "b" command
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')
>>>
>>> # parse some argument lists
>>> parser.parse_args(['a', '12'])
Namespace(bar=12, foo=False)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(baz='Z', foo=True)

請注意,parse_args() 返回的對象將僅包含由命令行選擇的主解析器和子解析器的屬性(而不包含任何其他子解析器)。所以在上麵的例子中,當指定a命令時,隻存在foobar屬性,而當指定b命令時,隻存在foobaz屬性.

類似地,當從子解析器請求幫助消息時,隻會打印該特定解析器的幫助。幫助消息將不包括父解析器或兄弟解析器消息。 (但是,可以通過向 add_parser() 提供 help= 參數來提供每個子解析器命令的幫助消息,如上所述。)

>>> parser.parse_args(['--help'])
usage: PROG [-h] [--foo] {a,b} ...

positional arguments:
  {a,b}   sub-command help
    a     a help
    b     b help

options:
  -h, --help  show this help message and exit
  --foo   foo help

>>> parser.parse_args(['a', '--help'])
usage: PROG a [-h] bar

positional arguments:
  bar     bar help

options:
  -h, --help  show this help message and exit

>>> parser.parse_args(['b', '--help'])
usage: PROG b [-h] [--baz {X,Y,Z}]

options:
  -h, --help     show this help message and exit
  --baz {X,Y,Z}  baz help

add_subparsers() 方法還支持 titledescription 關鍵字參數。當其中任何一個存在時,子解析器的命令將出現在幫助輸出中它們自己的組中。例如:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
...                                    description='valid subcommands',
...                                    help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage:  [-h] {foo,bar} ...

options:
  -h, --help  show this help message and exit

subcommands:
  valid subcommands

  {foo,bar}   additional help

此外,add_parser 支持額外的 aliases 參數,它允許多個字符串引用同一個子解析器。此示例與 svn 類似,將 co 別名為 checkout 的簡寫:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>> checkout = subparsers.add_parser('checkout', aliases=['co'])
>>> checkout.add_argument('foo')
>>> parser.parse_args(['co', 'bar'])
Namespace(foo='bar')

處理sub-commands 的一種特別有效的方法是將add_subparsers() 方法的使用與對set_defaults() 的調用結合起來,以便每個子解析器知道它應該執行哪個Python 函數。例如:

>>> # sub-command functions
>>> def foo(args):
...     print(args.x * args.y)
...
>>> def bar(args):
...     print('((%s))' % args.z)
...
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>>
>>> # create the parser for the "foo" command
>>> parser_foo = subparsers.add_parser('foo')
>>> parser_foo.add_argument('-x', type=int, default=1)
>>> parser_foo.add_argument('y', type=float)
>>> parser_foo.set_defaults(func=foo)
>>>
>>> # create the parser for the "bar" command
>>> parser_bar = subparsers.add_parser('bar')
>>> parser_bar.add_argument('z')
>>> parser_bar.set_defaults(func=bar)
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('foo 1 -x 2'.split())
>>> args.func(args)
2.0
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('bar XYZYX'.split())
>>> args.func(args)
((XYZYX))

這樣,您可以讓parse_args() 在參數解析完成後調用相應的函數。將函數與此類操作相關聯通常是為每個子解析器處理不同操作的最簡單方法。但是,如果需要檢查被調用的子解析器的名稱,add_subparsers() 調用的 dest 關鍵字參數將起作用:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(dest='subparser_name')
>>> subparser1 = subparsers.add_parser('1')
>>> subparser1.add_argument('-x')
>>> subparser2 = subparsers.add_parser('2')
>>> subparser2.add_argument('y')
>>> parser.parse_args(['2', 'frobble'])
Namespace(subparser_name='2', y='frobble')

在 3.7 版中更改:新的required關鍵字參數。

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 argparse.ArgumentParser.add_subparsers。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。