【问题标题】:Python argparse, positional arguments and subparsers [duplicate]Python argparse,位置参数和子解析器[重复]
【发布时间】:2016-09-13 07:31:32
【问题描述】:

我有以下 sn-p,其中我将 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')

我想知道上面的代码哪里出错了。请注意,“action”参数是位置参数。

提前谢谢你。这是我第一次使用子解析器,我可能犯了一个明显的错误。

提前谢谢你。

问候,

兰加

【问题讨论】:

  • 为什么要为子解析器添加参数?
  • 感谢您的快速回复。该参数仅对动作 "drop" 有意义。对于其他选项,它没有意义,因此我将它添加到子解析器中。为了清楚起见,我省略了其他子解析器。
  • 感觉你可能需要添加'action drop'。你可以运行 python populationb.py -h 来查看你需要传递的参数序列。
  • python .\populatedb.py -help 给出以下内容:用法:populatedb.py {drop,populate,print,create,print-metadata} 所以这似乎不是问题。跨度>

标签: python


【解决方案1】:

这里普遍接受的做法是没有子解析器的参数——这是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()

现在您不一定知道选择了哪个解析器,但不用担心,这里也有一个内置机制。一个常见的用例是为每个子解析器调用一个函数......

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

【讨论】:

  • 谢谢!这有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-01-10
  • 2013-10-07
  • 2020-11-10
  • 2012-01-29
  • 2016-09-05
  • 2018-12-31
  • 2015-11-08
  • 2012-04-25
相关资源
最近更新 更多