如何使用带有argparse的特定子命令require标志?

问题描述 投票:1回答:1

所以我正在编写一个使用argparse的python脚本,以便传递信息并处理输入。我一直在使用子命令来强制/使用程序中的不同操作。到目前为止,我的脚本的格式如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import argparse

def main(username, password, api, apiId):
    print("Hello, world!")

def _cli():
    # Create parser to obtain arguments
    parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.ArgumentDefaultsHelpFormatter, argument_default=argparse.SUPPRESS)
    subparsers = parser.add_subparsers(dest = "api", required = True)
    base_subparser = argparse.ArgumentParser(add_help = False)
    # Shared arguments
    base_subparser.add_argument('-u', '--username', help = "Username", default = "admin")
    base_subparser.add_argument('-p', '--password', help = "Password", default = "admin")

    # Create subcommands
    create_parser = subparsers.add_parser("create", parents = [base_subparser])
    update_parser = subparsers.add_parser("update", parents = [base_subparser])

    # Flag for sub-parser to pass API ID
    update_parser.add_argument('-i', '--apiId', help = "ID for API you are trying to access.", required = True)

    # Obtain all the argument values
    args = parser.parse_args()

    # Return them in a dictionary format
    return vars(args)

if __name__ == '__main__':
    # Pass arguments to main function using dictonary format.
    main(**_cli())

指定用法的地方:

用法:test.py [-h] {创建,更新} ...

位置参数:{创建,更新}

可选参数:-h,--help显示此帮助消息并退出

我的问题是,当update命令运行正常时,要求我传递一个ID,但我的create有一个错误/问题,尽管没有设置,但仍抱怨没有设置标志/传递标志。必需/需要。

main(**_cli())
TypeError: main() missing 1 required positional argument: 'apiId'

我在这里做错了什么以及如何解决?我曾尝试使用Google,但似乎无法理解问题/如何解决。

python python-3.x arguments argparse subcommand
1个回答
1
投票

您收到的错误告诉您在使用apiId子命令时未提供create。您可以指定默认参数,如下所示:

def main(username, password, api, apiId=None):
    print("API: {}".format(api))
    print("API ID: {}".format(apiId))
~ python args.py create -u a -p b
API: create
API ID: None
~ python args.py update -u a -p b -i c
API: update
API ID: c

或者您可以使用函数定义中的dict扩展名获得关键字参数的**

def main(**kwds):
    print(kwds)
~ python args.py create -u a -p b
{'api': 'create', 'username': 'a', 'password': 'b'}
~ python args.py update -u a -p b -i c
{'api': 'update', 'username': 'a', 'password': 'b', 'apiId': 'c'}
© www.soinside.com 2019 - 2024. All rights reserved.