Subparser - 显示解析器和subparser的帮助

时间:2015-09-15 08:37:29

标签: python python-2.7 argparse

我已经查看过几十个类似的SO问题,但是找不到合适的解决方案,所以请原谅我,如果是公开的话。 我遇到类似于this one

的问题

我希望有一个解析器+子解析器对,带有--help选项,如果subparser被激活"则会显示两者的帮助。

我能够获得完整(解析器+子分析器)帮助的唯一方法是:

common_parser = argparse.ArgumentParser(add_help=False)
common_parser.add_argument('-c', required = True)
parser = argparse.ArgumentParser(parents=[common_parser])
subparsers = parser.add_subparsers(dest="sub")
subparser = subparsers.add_parser("sub_option", parents=[common_parser])
subparser.add_argument('-o', required = False)
settings = parser.parse_args()

但是脚本需要输入-c选项两次(显然是解析器和子解析器)。如果我没有使用parents,那么我会得到正常的行为,但我不能为subparser提供的帮助只包含-o个描述(我也想要-c示出)

P.S。 Python 2.7

1 个答案:

答案 0 :(得分:0)

首先,让我们区分解析行为和帮助显示。

我假设你有多个subparser(否则为什么使用subparser机制)。 -o是特定于sub_option的参数,并且可能其他子分析符都有自己的参数。

-c的目的是什么?这是所有子分析师共有的东西吗?由于subparsers是必需的,所以谈论一个只对主解析器有用的参数是没有意义的。

处理常见参数的一种方法是为所有子分析器定义它。您使用的父母机制可以为您节省一些打字。只需从主parser定义中省略它即可。这摆脱了必须提供两次的问题。

如果为所有子分析器定义了-c,那么是否需要在主解析器帮助中显示它,是吗?

当subparser命令是第一个参数字符串时,整个subparser机制最干净,其后面包含所有参数,位置和选项。可以为主解析器定义参数,但它通常会使用和帮助变得复杂。

显示主解析器和(所有)子解析器的帮助的问题之前出现过,无论是在SO上还是在python bug /问题上。没有一个简单的解决方案。一些可能有用的工具是:

  • 使用parser.print_help()subparse.print_help()在程序控制下生成帮助。

  • add_subparsers()命令采用progtitledescription等参数来控制帮助,包括subparser帮助的usage

  • add_subparser()采用与ArgumentParser相同的参数(因为它定义了解析器),descriptionusage可能很有用。

查看上一个问题

How to show help for all subparsers in argparse?

我意识到如果不需要-c,可以为main和subparser定义它,并在帮助中按预期显示。但是通过使其成为必需',两个解析器都必须看到它 - 但只有subparser看到的值出现在命名空间中。

主解析器中定义的位置也出现在subparser用法中。

另一个subparsers帮助显示问题

argparse subparser monolithic help output

http://bugs.python.org/issue20333 argparse subparser usage message hides main parser usage讨论了在subparse使用行中应显示多少主要解析器用法的问题。目前只有位置(在subparsers之前定义)出现。在补丁中我建议添加所需的选项。但是你总是可以通过为subparsers定义你自己的prog来捏造它。