【问题标题】:Make a command-line-based application with python argparse only仅使用 python argparse 制作基于命令行的应用程序
【发布时间】:2017-10-28 04:46:07
【问题描述】:

我想使用 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 help bar

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()

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    没有参数,我得到一个错误 - 它需要 subparsers 命令,“帮助”。正如定义的那样,顶层有几个标记的参数。子解析器的参数不会显示在用法中(如果启用,则不会显示完整的帮助)。

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

    在 Py3 中,子解析器是“可选的”,显示将要设置的内容:

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

    使用 'help' 子解析器,用法包括 '[-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。使用默认帮助方法不是更简单吗?您的用户可能更熟悉它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2015-07-11
      • 2013-11-11
      • 2018-12-03
      相关资源
      最近更新 更多