我定义了一个带有描述,选项和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
答案 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
都将被遗漏。
如果您关闭常规帮助(从而阻止打印和退出操作),解析后自行提供帮助是一个可行的选择。您将知道help
和verbose
的最终值。但是你将对自己的退出负责。
答案 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)
我建议采用不同的方法。
在解析器上执行漂亮打印,并找出epilog如何存储在选项中。或者通过 pdb.set_trace()进行调试,并使用 dirs 和 vars 来环顾四周。
即。弄清楚选项数据结构与epilog和没有epilog的结果。
自己看sys.argv
。如果 -h和-v 保持解析器不变。
如果 -h但不是-v ,请在调用之前调整解析器,使其看起来好像没有epilog。
您甚至可以构建2个解析器,一个使用epilog,一个不使用,并根据-v
标志动态决定调用哪个解析器。
P.S。实际上,你想检查
if "-h" in sys.argv and not "-v" in sys.argv
答案 4 :(得分:0)
我还看到了详细帮助的价值,以添加示例。
根据Python 2.7 argparse printing help和Python 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
控件。感谢上面的其他人的启发。