Python argparse,位置参数和子分析器

时间:2016-09-12 22:14:26

标签: python

我有以下代码片段,我使用带有多个子分析符的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,我可能犯了一个明显的错误。

提前谢谢。

此致

朗高

1 个答案:

答案 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')