我有以下代码片段,我使用带有多个子分析符的argparse
parser = argparse.ArgumentParser(description = "Setup the DB",
add_help=False)
parser.add_argument('action', type = str,
choices=['drop','populate','print','create','print-metadata'],
help = "Specify an action", default = None)
subparsers = parser.add_subparsers()
drop_parser = subparsers.add_parser('drop',parents=[parser])
drop_parser.add_argument('-dataset-name',
required=True,
type = str, help = "Dataset Name",
default = None)
.....
args = parser.parse_args()
.....
当我去运行时,我得到以下内容:
python .\populatedb.py drop -dataset-name foo
populatedb.py: error: invalid choice: 'foo' (choose from 'drop', 'populate', 'print', 'create', 'print-metadata')
我想知道上面的代码出错了。请注意"动作"参数是一种位置论证。
提前谢谢你。这是我第一次使用subparsers,我可能犯了一个明显的错误。
提前谢谢。
此致
朗高
答案 0 :(得分:0)
这里普遍接受的事情是没有对subparser的论证 - 它是argparse
提供的自己的论点:
parser = argparse.ArgumentParser(description = "Setup the DB",
add_help=False)
subparsers = parser.add_subparsers()
drop_parser = subparsers.add_parser('drop',parents=[parser])
drop_parser.add_argument('-dataset-name',
required=True,
type = str, help = "Dataset Name",
default = None)
.....
args = parser.parse_args()
现在你不一定知道选择了哪个解析器但不担心,这里也有一个内置的机制。一个常见的用例是为每个subparser调用一个函数...
parser = argparse.ArgumentParser(description = "Setup the DB",
add_help=False)
subparsers = parser.add_subparsers()
def drop_parser_handler(args):
...
drop_parser = subparsers.add_parser('drop',parents=[parser])
drop_parser.add_argument('-dataset-name',
required=True,
type = str, help = "Dataset Name",
default = None)
drop_parser.set_defaults(func=drop_parser_handler)
.....
args = parser.parse_args()
args.func(args)
当然你不需要做任何复杂的事情 - 你可以设置一个常数值:
drop_parser.set_defaults(subparser_name='drop')