使用python argparse创建一个基于命令行的应用程序

时间:2017-10-27 19:25:05

标签: python argparse

我想使用python和argparse库创建一个基于命令行的应用程序。但我对这个库有一些挑战,这是命令看起来像(用法):

prog (foo|bar) [-v] (-h "key:value")* [-d inline-data] [-f file] URL

这是 prog help 输出:

> prog help
prog is a simple application
Usage:
prog command [arguments]
The commands are:
foo executes FOO
bar executes BAR
help prints this screen.
Use "prog help [command]" for more information about a command.

我的挑战在于这一部分。当我们执行以下命令时,我想给出单独的帮助描述:
prog help foo
prog帮助栏

import argparse
parser = argparse.ArgumentParser(prog='prog.py',description='some help', add_help=False)
#I turned off the default help, and defined -h separately.
parser.add_argument('-h', '--header', metavar='', help='headerHelpString')
subparsers = parser.add_subparsers(help='help sub-command')
subparserHelp = subparsers.add_parser('help', help='some help')
subparserFooBar = subparserHelp.add_argument('method', choices=['foo', 'bar'])
group = parser.add_mutually_exclusive_group()
group.add_argument('-q', '--quiet', action='store_true', help='print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='print verbose')
args = parser.parse_args()

1 个答案:

答案 0 :(得分:1)

没有参数,我收到错误 - 它需要subparsers命令'help'。根据定义,顶部有几个标记的参数。 subsparser的参数不会显示在用法中(如果已启用,则显示完整的帮助)。

1327:~/mypy$ python stack46982125.py 
usage: prog.py [-h] [-q | -v] {help} ...
prog.py: error: too few arguments

在Py3中,subparsers是“可选的”,显示了要设置的内容:

1328:~/mypy$ python3 stack46982125.py 
Namespace(header=None, quiet=False, verbose=False)

使用'help'subparser,用法包括'[ - h]',但这是默认帮助。子分析器不继承add_help参数;你必须明确地设置它。

1328:~/mypy$ python3 stack46982125.py help
usage: prog.py help [-h] {foo,bar}
prog.py help: error: the following arguments are required: method

利用-h,我可以得到更全面的帮助。

1329:~/mypy$ python3 stack46982125.py help -h
usage: prog.py help [-h] {foo,bar}

positional arguments:
  {foo,bar}

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

如果我还定义了所需的'foo / bar',它解析得很好。

1329:~/mypy$ python3 stack46982125.py help foo
Namespace(header=None, method='foo', quiet=False, verbose=False)

如果我添加

parser.print_help()
subparserHelp.print_help()

我得到了额外的输出:

usage: prog.py [-h] [-q | -v] {help} ...

some help

positional arguments:
  {help}          help sub-command
    help          some help

optional arguments:
  -h , --header   headerHelpString
  -q, --quiet     print quiet
  -v, --verbose   print verbose
usage: prog.py help [-h] {foo,bar}

positional arguments:
  {foo,bar}

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

如果我添加dest参数

subparsers = parser.add_subparsers(dest='cmd', help='help sub-command')

使印刷品成为条件

if args.cmd == 'help':
    parser.print_help()
    subparserHelp.print_help()

没有显示帮助(在py3中)或上面的错误(py2)

1340:~/mypy$ python3 stack46982125.py
Namespace(cmd=None, header=None, quiet=False, verbose=False)

显示帮助:

1341:~/mypy$ python3 stack46982125.py help foo
Namespace(cmd='help', header=None, method='foo', quiet=False, verbose=False)
....

如果您关闭-h帮助,则必须以某种方式捕获“帮助”字符串,并使用您自己的帮助或print_help方法对其进行操作。您还可以定义另一个标记的参数,并为其指定action='help'参数。

您真的需要关闭默认add_help。使用默认帮助方法不是更简单吗?您的用户可能更熟悉。