我制作了一个执行很多操作的 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()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我希望如果有人运行 ./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])
Run Code Online (Sandbox Code Playgroud)
您将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')
Run Code Online (Sandbox Code Playgroud)
结果是:
$ 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
Run Code Online (Sandbox Code Playgroud)
但是请注意,在这种情况下,该选项仅是父解析器的一部分,而不是子解析器的一部分,这意味着以下内容:
$python script.py --threads Start
Run Code Online (Sandbox Code Playgroud)
是正确的,而:
$ python script.py Start --threads
usage: script.py [-h] [--threads] {Restart,Start} ...
script.py: error: unrecognized arguments: --threads
Run Code Online (Sandbox Code Playgroud)
因为--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])
Run Code Online (Sandbox Code Playgroud)
这应该做你想做的:
$ 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5738 次 |
| 最近记录: |