当前位置: 首页 > 面试题库 >

如何在argparse中显示所有子解析器的帮助?

微生博简
2023-03-14
问题内容

我制作了一个Python脚本,该脚本可以执行很多操作,因此它具有许多选项,因此我将其划分为一些子解析器,这些子解析器也使用父解析器进行常见选项分组。

我想要一个帮助选项,该选项将显示所有命令及其选项的帮助,是否可以不覆盖format_help方法

我看到了类似的问题,但是分组对我来说并不重要,我只想在那里找到选项。

例如:

general_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False)
general_group.add_argument('--threads', action='store_true', default=False)
second_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False)
second_group.add_argument('--sleep', action='store', default=60, type=int)
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group,second_group])
subparsers.add_parser('Start',parents=[general_group])

args = parser.parse_args()

在这种情况下,我希望如果有人运行./script.py -h,他们将在帮助中看到线程选项。


问题答案:

问题在于:

subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group,second_group])
subparsers.add_parser('Start',parents=[general_group])

您是general_group作为子解析器的父级添加的,因此主解析器不了解它们,导致./script.py -h不显示--threads。如果计划将其作为所有子解析器的父级,则应将其作为顶级解析器的父级:

parser = argparse.ArgumentParser(parents=[general_group])
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[second_group])
subparsers.add_parser('Start')

结果是:

$ python script.py -h
usage: script.py [-h] [--threads] {Restart,Start} ...

positional arguments:
  {Restart,Start}

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

但是请注意,在这种情况下,该选项仅是父解析器的一部分,而不是子解析器的一部分,这意味着:

$python script.py --threads Start

是正确的,而:

$ python script.py Start --threads
usage: script.py [-h] [--threads] {Restart,Start} ...
script.py: error: unrecognized arguments: --threads

因为--threads不是由子解析器“继承”。如果要--threads在子解析器中也包含它,则必须在其parents参数中指定它:

parser = argparse.ArgumentParser(parents=[general_group])
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group, second_group])
subparsers.add_parser('Start', parents=[general_group])

这应该做您想要的:

$ python script.py -h
usage: script.py [-h] [--threads] {Restart,Start} ...

positional arguments:
  {Restart,Start}

optional arguments:
  -h, --help       show this help message and exit
  --threads
$ python script.py Start -h
usage: script.py Start [-h] [--threads]

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


 类似资料:
  • 问题内容: 我正在使用Python 3.4,正在尝试与子解析器一起使用,并且我希望具有与Python 2.x中类似的行为,如果我不提供位置参数(以指示子解析器/子程序)我会收到一条有用的错误消息。即,随着我将得到以下错误消息: 我正在按照http://codingdict.com/questions/172394建议设置属性,但是这给了我Python 3.4.0错误: -完全追溯: 这是我的程序-

  • 问题内容: 我一直在这里和总体上搜索所有子解析器示例的分配,但似乎无法弄清楚这看似简单的事情。 我有两种var类型,其中一种具有约束,所以认为使用subparser是必经之路。例如-t允许“ A”或“ B”。如果用户通过“ A”,则进一步要求他们还指定它是“ a1”还是“ a2”。如果他们只是通过“ B”,那么什么也没有。 我可以这样做,让argparse返回给我什么类型的“ A”,或者只是“ B

  • 问题内容: 我的argparse在顶层只有3个标记(store_true),其他所有内容都通过子解析器处理。当我运行时,输出显示所有子命令的列表,如正常的。因此,默认设置效果很好… 我通常不记得我需要的确切子命令名称及其所有选项。因此,我最终进行了2个帮助查找: 我经常这样做,所以我决定将其塞入一步。我宁愿让我的顶级帮助输出大量摘要,然后手动滚动列表。我发现它快得多(至少对我来说)。 我正在使用R

  • 问题内容: 我有以下代码(使用Python 2.7): 现在,我希望能够调用此程序,例如在普通程序或某些子命令后附加: 基本上,我需要声明可选的子解析器。我知道这并不是真正支持的方法,但是有任何解决方法或替代方法吗? 编辑:我得到的错误信息: 问题答案: 根据文档,带有(而不带有)的会自动打印版本号:

  • 问题内容: 我想在脚本中定义不同的子解析器,两个子解析器均从同一个父级继承选项,但具有不同的默认值。但是,它没有按预期工作。 这是我所做的: 当我从命令行运行脚本时,得到的是: 显然,第二个覆盖了父对象中的第一个。由于argparse文档中没有任何内容(非常详细),所以我认为这可能是一个错误。 有一些简单的解决方案吗?之后,我可以检查变量,并使用每个子解析器的预期默认值替换值,但这就是我期望arg

  • 问题内容: 当我在Eclipse中编辑Java类时,当光标悬停在类变量上时,我可以使用+ 弹出框来显示其所有父级和子类。IntelliJ中的等效项是什么? 例: 管道是我的光标。 问题答案: 导航| 但是,在“面板”中,“ 类型 +” 将显示类似的信息。您可以 浮动 和 取消 固定面板,以使其仅在使用键盘快捷键时才出现在固定的显示位置。