python argparse corss 子命令选项

如何解决python argparse corss 子命令选项

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

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

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

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

怎么做?

解决方法

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

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

您可以通过为 main 和 sub 指定不同的 dest 来解决这个问题。您仍然可以使用相同的“-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',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,--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',verbose=True)
,

您可能想像这样使用 parents

import argparse

base_parser = argparse.ArgumentParser(add_help=False)
base_parser.add_argument("-v","--verbose",help="verbose",action="store_true")

parser = argparse.ArgumentParser(parents=[base_parser])
subparsers = parser.add_subparsers()
parser_1 = subparsers.add_parser("sub",parents=[base_parser])
parser_1.add_argument("--foo",help="Some opt")
args = parser.parse_args()
print(args)

这会产生什么:

~ python args.py -h
usage: args.py [-h] [-v] {sub} ...

positional arguments:
  {sub}

optional arguments:
  -h,--verbose  verbose

~ python args.py sub -h
usage: args.py sub [-h] [-v] [--foo FOO]

optional arguments:
  -h,--verbose  verbose
  --foo FOO      Some opt

不过,此方法需要在子命令之后使用 -v 标志。

~ python args.py sub -v --foo 9
Namespace(verbose=True,foo='9')   # -v is recognised

~ python args.py -v sub --foo 9
Namespace(verbose=False,foo='9')  # -v is not recognised

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?