如何让特定的子命令需要带有 argparse 的标志?
How to have a specific sub-command require flag with argparse?
所以我正在编写一个 python 脚本,它使用 argparse 来传递信息和处理输入。我一直在使用子命令来 force/use 程序中的不同操作。到目前为止,我的脚本格式如下:
#!/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())
用法是这样指定的:
usage: test.py [-h] {create,update} ...
positional arguments:
{create, update}
optional arguments:
-h, --help show this help message and exit
我的问题是,虽然 update
命令工作正常,但我需要传递 ID,但我的 create
有一个 bug/issue,它抱怨没有设置flag/passing 一个,尽管它不是 required/needed。
main(**_cli())
TypeError: main() missing 1 required positional argument: 'apiId'
我在这里做错了什么,我该如何解决?我试过 google 但我似乎无法理解 problem/how 来解决它。
您得到的错误是告诉您当您使用 create
子命令时未提供 apiId
。您可以指定默认参数,如下所示:
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'}
所以我正在编写一个 python 脚本,它使用 argparse 来传递信息和处理输入。我一直在使用子命令来 force/use 程序中的不同操作。到目前为止,我的脚本格式如下:
#!/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())
用法是这样指定的:
usage: test.py [-h] {create,update} ...
positional arguments: {create, update}
optional arguments: -h, --help show this help message and exit
我的问题是,虽然 update
命令工作正常,但我需要传递 ID,但我的 create
有一个 bug/issue,它抱怨没有设置flag/passing 一个,尽管它不是 required/needed。
main(**_cli())
TypeError: main() missing 1 required positional argument: 'apiId'
我在这里做错了什么,我该如何解决?我试过 google 但我似乎无法理解 problem/how 来解决它。
您得到的错误是告诉您当您使用 create
子命令时未提供 apiId
。您可以指定默认参数,如下所示:
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'}