首页 > 解决方案 > python argparse corss 子命令选项

问题描述

使用argparse,我正在尝试创建一个全局可用的可选参数(在所有命令和子命令中)。

例如,设置一个--verbose可选参数。--help与默认情况下可用的方式相同。

以下代码段仅适用于非子命令

parser.add_argument(
  '-v', '--verbose',
  help='verbose',
  type=bool,
  default=False,
  action=argparse.BooleanOptionalAction
)

怎么做到呢?

标签: pythonargparse

解决方案


每个解析器,main 和 sub,都会获得一个自动help参数(除非您指定add_help=False)。此外,“-h”在显示其消息后立即退出。因此,如果 '-h' 在子命令字符串之前,您会看到主要帮助。如果在您看到该子命令的帮助之后。

要使诸如“-v”之类的命令在主解析器和子解析器中都可用,您必须在所有解析器中定义它。parents可以简化这一点。但这有问题,正如@Alex 指出的那样。子命令的default值会覆盖在主命令(默认或用户)中设置的任何值。

dest您可以通过为 main 和 subs指定不同的值来解决此问题。您仍然可以使用相同的“-v”,但值将在args.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v','--verbose', action='store_true')
sp = parser.add_subparsers(dest='cmd')
sp1 = sp.add_parser('cmd1')
sp1.add_argument('-v', '--verbose', action='store_true', dest='subverbose')

args = parser.parse_args()
print(args)

样本运行:

0925:~/mypy$ python3 stack65773318.py -h
usage: stack65773318.py [-h] [-v] {cmd1} ...

positional arguments:
  {cmd1}

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose
0928:~/mypy$ python3 stack65773318.py cmd1 -h
usage: stack65773318.py cmd1 [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose
0928:~/mypy$ python3 stack65773318.py -v
Namespace(cmd=None, verbose=True)
0928:~/mypy$ python3 stack65773318.py -v cmd1
Namespace(cmd='cmd1', subverbose=False, verbose=True)
0928:~/mypy$ python3 stack65773318.py cmd1 -v
Namespace(cmd='cmd1', subverbose=True, verbose=False)
0928:~/mypy$ python3 stack65773318.py -v cmd1 -v
Namespace(cmd='cmd1', subverbose=True, verbose=True)

推荐阅读