Python Argparse子解析器

在市场

我正在使用Argparse模块来解析命令行选项。我有一个调用下标A或下标B的主脚本。我现在有一个A和B的子解析器实例,以及一个主解析器实例,其中应包含有关A和B所需变量的信息。就像是:

def __init__(self):
    parser = argparse.ArgumentParser("Parser")
    parser.addArgument('--input') #this should be availabe for A and B

    subparsers = parser.add_subparsers('Description')
    A_parser = subparsers.add_parser(A)
    A_paser.add_argument('--a_option')

    B_parser = parser.add_subparser('Description')
    B_parser.add_arguemnt('--b_option')

    args = parser.parse_args()

但是,如果以这种方式使用它,那么如果我在程序调用中未指定A或B,则只能通过--input选项更改args.options。执行

program.py A --input ./

要么

program.py --input ./ A

都失败了。

阿德里安·W

我认为您弄乱了python文档中的示例用法。我试图编辑您的代码示例,但是我放弃了很多错别字。特别是add_subparsers()的用法add_parser()混淆了。

代码的清理(且自包含)版本如下所示:

import argparse


parser = argparse.ArgumentParser("Parser")
parser.add_argument('--input') #this should be available for A and B

subparsers = parser.add_subparsers(help='Description')
A_parser = subparsers.add_parser('A')
A_parser.add_argument('--a_option')

B_parser = subparsers.add_parser('B')
B_parser.add_argument('--b_option')

现在你可以打电话

args = parser.parse_args(['--input', 'foo'])

但是也

args = parser.parse_args(['--input', 'bar', 'A', '--a_option', 'a_option_arg'])

args = parser.parse_args(['--input', 'baz', 'B', '--b_option', 'b_option_arg'])

更新资料

在评论中,您要求:

是否有可能我也可以为--input选项传递未知数量的参数,但之后仍带有A选项?就像是:program.py --input ./ ../ ../../ A -a_option

如果要将未知数量的参数--input传递nargs='*'选项,则需要传递给的参数定义--input但是,您不能再使用诸如A和之类的标记B来选择子解析器,因为它们将被当作的进一步参数--input

在这种情况下,您可以求助于父解析器。使用父解析器,您可以将多个解析器的选项合并为一个:

import argparse


A_parser = argparse.ArgumentParser(add_help=False)
A_parser.add_argument('--a_option')

B_parser = argparse.ArgumentParser(add_help=False)
B_parser.add_argument('--b_option')

parser = argparse.ArgumentParser("Parser", parents=[A_parser, B_parser])
parser.add_argument('--input', nargs='*')  # this should be available for A and B

现在,所有选项每次都可用:

args = parser.parse_args(['--input', 'foo'])
args = parser.parse_args(['--input', 'foo' , 'bar', '--a_option', 'a_option_arg'])
args = parser.parse_args(['--input', 'baz', '--b_option', 'b_option_arg'])

请注意,不再有“ A”和“ B”标签。通过选择由定义的选项之一来选择“ A” A_parser甚至可以同时使用:

args = parser.parse_args(['--input', 'foo' ,'--a_option', 'a_option_arg', '--b_option', 'b_option_arg'])

如果您不希望这样做,则需要对冲突的参数进行检查。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python argparse:如何控制子解析器的帮助屏幕中的换行?

如何从 Python 3 中的现有程序使用 argparse 创建子解析器?

python argparse-将动作添加到不带参数的子解析器?

超出Python 2.7.6的子解析器的Argparse set_defaults吗?

如何在python argparse中使用子解析器定义全局选项?

从解析器获取参数名称,而不在 argparse python 中解析参数

Python minidom XML解析器-忽略子标签

分组argparse子解析器参数

Python argparse-向多个子解析器添加参数

Python argparse-向多个子解析器添加参数

Python argparse-将父解析器参数分组

python argparse 两个子解析器基本相同..几乎

Python Json解析器

Python日志解析器

Python Nmap解析器

Python 解析器,Str

使用嵌套子解析器时,Python argparse 会创建不正确的用法字符串

Python:argparse 的解析器是否有等效于 logging.getLogger(__name__) 以在模块之间传递 args?

如何获得argparse选择默认的子解析器?

带有所需子解析器的Argparse

带有所需子解析器的Argparse

如何正确使用argparse子解析器?

Argparse:子解析器未显示默认值

具有功能的argparse子解析器

如何打印Argparse主解析器的帮助(使用)部分而不是子解析器的使用?

argparse-组合父解析器,子解析器和默认值

如何从父解析器获取 argparse 子解析器(检查默认值)

在解析器/子解析器的开头使用argparse.REMAINDER

Python:从 arg 解析器到字典