如何使argparse仅使用一个参数,即使很多都被传递?

时间:2015-12-08 21:09:34

标签: python argparse

我的解析器的结构:

parser = argparse.ArgumentParser()
parser.add_argument('-s', '--search')
parser.add_argument('-t', '--status' action='store_true')
args = parser.parse_args()
if args.search:
    func(args.search)
if args.status:
    func1()

现在,解析器可以接受这两个选项,-s query -t有效。 我有两个问题:

  1. 仅当传递了多个参数时,如何对第一个参数执行操作。 -s query -t必须只生成

    if args.search:
        func(args.search)
    

    待完成。

  2. 如果传递多个args,如何抛出错误?

1 个答案:

答案 0 :(得分:3)

这里适当的工具是subparser;惯用法与目前建议的命令行不同。

def your_search_function(options):
    pass # do a search here

def your_status_function(options):
    pass # collect status here

def main():
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparser(dest='action')

    search_parser = subparsers.add_parser('search')
    search_parser.set_defaults(func=your_search_function)

    status_parser = subparsers.add_parser('status')
    status_parser.set_defaults(func=your_status_function)

    results = parser.parse_args()
    results.func(options=results)

if __name__ == '__main__':
    main()

用法如下:

./yourcommand <global options> search <search options>

./yourcommand <global options> status <status options>

...由于它将子命令作为参数而不是选项运行,因此不允许传递多个子命令,因此只有在使用不明确时才能使问题部分无效。

可以像往常一样将全局选项添加到parser;特定于搜索的search_parser选项以及status_parser的特定于状态的选项。