以下是一个示例代码:
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
识别为有效参数。
答案 0 :(得分:9)
由于这个问题在2018年仍有访问,在使用argparse进行任何此类复杂操作之前,请考虑使用docopt或click。它将改善您的理智以及可能阅读或修改您的代码的任何人的理智。谢谢。
原样,你有一些问题。
首先,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.html和https://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 解析与该名称相同的命名空间中的其余参数。父级而不考虑父级可能已经设置的属性。