在python中,如何在父解析器的参数中读取子分析器?

时间:2011-08-15 15:22:56

标签: python argparse

以下是一个示例代码:

import argparse

parser=argparse.ArgumentParser()
parser.add_argument('-main_arg')
subparser=parser.add_subparser()
a=subparser.add_parser('run')
a.add_argument('required_sub_arg')
a.add_argument('arg_a')
b=subparser.add_parser('b')
parser.parse_args()

如果我输入-main_arg

,我希望它能够在program run required_sub_arg -main_arg -arg_a中阅读

现在,它不会将-main_arg识别为有效参数。

2 个答案:

答案 0 :(得分:9)

PSA给最近的读者

由于这个问题在2018年仍有访问,在使用argparse进行任何此类复杂操作之前,请考虑使用docoptclick。它将改善您的理智以及可能阅读或修改您的代码的任何人的理智。谢谢。

原始答案

原样,你有一些问题。

首先,parser.parse_args是一个返回parser参数名称空间的方法,所以你应该做类似的事情

args = parser.parse_args()

然后args.main_args

等电话中获取-main_arg
program -main_arg run required_sub_arg -arg_a

main_arg的问题在于您为名为parser的{​​{1}}创建了一个参数,并且您拨打电话

main_arg

指向名为program run required_sub_arg -main_arg -arg_a 的{​​{1}}的参数。由于a没有这样的参数,因此无效。

为了从其中一个subparser引用解析器的参数,你必须让所述subparser继承其父级的参数。这是通过

完成的
main_arg

你有错误的subsparser for child parser。有关更多信息,请参阅http://docs.python.org/dev/py3k/library/argparse.htmlhttps://code.google.com/p/argparse/issues/detail?id=54

答案 1 :(得分:0)

对于到达这里的使用argparse的其他人,寻找在“主”帮助屏幕中显示“公共”子分析器参数的方法,这是一种方法:

import argparse
common = argparse.ArgumentParser(add_help=False)
common.add_argument('--shared', action='store_true', help='some shared arg')
parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('--parent', action='store_true', help='parent only arg')
subparsers = parser.add_subparsers()
run = subparsers.add_parser('run', parents=[common])
run.add_argument('--fast', action='store_true', help='run only arg')
parser.epilog = "--- Arguments common to all sub-parsers ---" \
    + common.format_help().replace(common.format_usage(), '')
args = parser.parse_args()

主要帮助:

$ program.py -h
usage: program.py [-h] {run} ...

positional arguments:
  {run}

optional arguments:
  -h, --help  show this help message and exit
  --parent    parent only arg

--- Arguments common to all sub-parsers ---
optional arguments:
  --shared  some shared arg

run子解析器帮助:

$ program.py run -h
usage: program.py run [-h] [--shared]

optional arguments:
  -h, --help  show this help message and exit
  --shared    some shared arg
  --fast      run only arg

为解决实际问题,由于无法接受已接受的答案,因此,这里有一些其他信息,说明为什么似乎无法在父级和子级/子解析器之间真正共享相同名称的argparse参数解析器。

首先,以下代码有问题:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-main_arg')
subparsers = parser.add_subparsers()
run = subparsers.add_parser('run', parents=[parser])
args = parser.parse_args()

是否会导致以下错误,因为父parser和子解析器run都定义了-h /-help参数(默认情况下)。

Argparse.ArgumentError: argument -h/--help: conflicting option strings: -h, --help

虽然可以通过在父级或子级中取消-h /-help选项(使用add_help=False来避免此错误,但在两个级别上都具有help选项是很好的。

另一种避免冲突的帮助选项的潜在方法是将 common 参数移至共享解析器common

import argparse
common = argparse.ArgumentParser(add_help=False)
common.add_argument('-main_arg', action='store_true')
parser = argparse.ArgumentParser(parents=[common])
subparsers = parser.add_subparsers()
run = subparsers.add_parser('run', parents=[common])
args = parser.parse_args()
print(args)

虽然这似乎可以在表面上起作用,但实际上并不能按预期进行:

$ program.py run  # OK
Namespace(main_arg=False)
$ program.py run -main_arg  # OK
Namespace(main_arg=True)
$ program.py -main_arg run  # BAD: expected main_arg to be True
Namespace(main_arg=False)

解析program.py -main_arg run时观察到的行为说明了一个关键关系:父argparser 及其子解析器独立解析器,其中父级解析所有参数直至子解析器“命令”位置参数,然后选定的 sub-parser 解析与该名称相同的命名空间中的其余参数。父级而不考虑父级可能已经设置的属性。