python argparse:仅在详细时打印epilog

时间:2016-04-20 08:40:44

标签: python argparse

我定义了一个带有描述,选项和epilog的解析器。当我使用--help运行应用程序时,它会按预期输出epilog的帮助。但是,如果--help附带--verbose,我只想看到epilog。用argparse实现这个目的的正确方法是什么?

# example code in file test
import argparse
parser = argparse.ArgumentParser( description='description', epilog='epilog' )
parser.add_argument('-v', '--verbose', action='store_true', help='verbose help')
parser.parse_args()

当我按如下方式运行测试时

$ python test -h

它产生

 usage: test [-h] [-v]

description

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

epilog

但是,我想看到的是

 usage: test [-h] [-v]

description

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

只有在我运行

时才会显示epilog
$ python test -h -v

5 个答案:

答案 0 :(得分:2)

伊克。我知道这样做的唯一方法是自己编写帮助输出:

import argparse
parser = argparse.ArgumentParser( 
  description='description', 
  add_help=False )
parser.add_argument(
  '-h', '--help',
  action=store_true,
  dest='show_help')   
parser.add_argument(
  '-v', '--verbose', 
  action='store_true', 
  help='verbose help')
args = parser.parse_args()
if args.show_help:
  if args.verbose:
    print '%s\n%s' % (parser.format_help(), 'epilog')
  else
    parser.print_help()
  sys.exit(0)     

答案 1 :(得分:1)

argparse中没有为此提供条款。因此,您必须编写自己的代码以在解析之前更改epilog,或者在解析之后执行您自己的help,或者可以修改format_help方法。

您可以在创建后查看和更改解析器的epilog属性。

parser = argparse.ArgumentParser(epilog='test')
print parser.epilog  # should see 'test'
parser.epilog = None # or ''

一个删除的答案建议在解析之前查看sys.argv,如果--verbose存在,请修改epilog属性。这可能会错过某些指定值的方法(例如-hv),但它相对简单。

在解析期间对--verbose执行操作很困难。解析器一解析它就会在-h上运行,显示消息并退出。因此,-v之后的任何-h都将被遗漏。

如果您关闭常规帮助(从而阻止打印和退出操作),解析后自行提供帮助是一个可行的选择。您将知道helpverbose的最终值。但是你将对自己的退出负责。

答案 2 :(得分:1)

使用建议的想法,这是我想出的:

import argparse
parser = argparse.ArgumentParser( description='description', epilog='', add_help=False )
parser.add_argument('-h', '--help', action='store_true', help='show help')
parser.add_argument('-v', '--verbose', action='store_true', help='more help')
args = parser.parse_args()

if args.help:
    if args.verbose:
        parser.epilog += "epilog for %(prog)s"
    else:
        parser.epilog += "\nfor more help run '%(prog)s -h -v'"
    parser.print_help()
    parser.exit(0)

print 'the end'

我发现这种方法的唯一困难是不再可能添加必需的选项或位置参数。位置参数的解决方法是使用nargs ='?'并手动进行检查。

答案 3 :(得分:0)

我建议采用不同的方法。

1按照您现在的步骤构建解析器。

在解析器上执行漂亮打印,并找出epilog如何存储在选项中。或者通过 pdb.set_trace()进行调试,并使用 dirs vars 来环顾四周。

即。弄清楚选项数据结构与epilog和没有epilog的结果。

2而不是调用parser.parse_args()(标准使用):

  • 自己看sys.argv。如果 -h和-v 保持解析器不变。

  • 如果 -h但不是-v ,请在调用之前调整解析器,使其看起来好像没有epilog。

使用parser.parse_args()调用

3

您甚至可以构建2个解析器,一个使用epilog,一个不使用,并根据-v标志动态决定调用哪个解析器。

P.S。实际上,你想检查

if "-h" in sys.argv and not "-v" in sys.argv

答案 4 :(得分:0)

我还看到了详细帮助的价值,以添加示例。

根据Python 2.7 argparse printing helpPython 2.7 argument parser objects以及上面的评论,我决定采用以下方法:

import argparse

. . .

if __name__ == '__main__':

    description_text = """
DESCRIPTION
    This command ...
"""

    epilog_text = """
    After execution, the user can ... 
"""

    example_text = """
EXAMPLES
    The following examples ...
"""

    parser = argparse.ArgumentParser(
                  description=description_text,
                  epilog=epilog_text,
                  formatter_class=argparse.RawDescriptionHelpFormatter,
                  add_help=False)

    parser.add_argument('-h', '--help', dest='help', action='store_true',
                        help='Show help and exit; see also --verbose')
    parser.add_argument('--usage', dest='usage', action='store_true',
                        help='Show usage and exit')
    . . .
    parser.add_argument('-v', '--verbose', dest='verbose',
                        action='store_true',
                        help='Display additional help or logging')

    arguments = parser.parse_args()
    
    if arguments.usage:
        print(parser.format_usage())
        sys.exit(0)

    if arguments.help:
        help_string = parser.format_help()
        if arguments.verbose:
                help_string += example_text
        print(help_string)
        sys.exit(0)

    . . .

结果是灵活的输出,支持命令的--help--help --verbose--usage控件。感谢上面的其他人的启发。