使用 Class() 时如何显示 argparse 中所有子解析器的帮助
How to show help for all subparsers in argparse when using a Class()
对使用 argparse 和 cmd 行非常陌生。我已经开始构建一个允许前端用户通过 cmd 终端输入数据的解析器。解析器正在调用我创建的 API() class(创建 SQLALCHEMY 会话等),此处显示示例:
class API(object):
def __init__(self):
# all the session / engine config here
def create_user(self, username, password, firstname, lastname, email):
new_user = User(username, password, firstname, lastname, email)
self.session.add(new_user)
self.session.commit()
print(username, firstname, lastname)
def retrieve_user(self, username, firstname, lastname):
# code here ... etc .
在此处的CMD文件中实现:
def main():
parser = argparse.ArgumentParser(prog='API_ArgParse', description='Create, Read, Update, and Delete (CRUD) Interface Commands')
subparsers = parser.add_subparsers(
title='subcommands', description='valid subcommands', help='additional help')
api = API() # calling the API class functions/engine
# Create command for 'user'
create_parser = subparsers.add_parser('create_user', help='create a user')
create_parser.add_argument('username', type=str, help='username of the user')
create_parser.add_argument('password', type=str, help='password')
create_parser.add_argument('firstname', type=str, help='first name')
create_parser.add_argument('lastname', type=str, help='last name')
create_parser.add_argument('email', type=str, help='email address')
#args = parser.parse_args() <--EDIT:removed from here and placed on bottom
api.create_user(args.username, args.password, args.firstname, args.lastname, args.email)
# Retrieve command for 'user'
retrieve_parser = subparsers.add_parser('retrieve_user', help='retrieve a user')
retrieve_parser.add_argument('username', type=str, help='username')
retrieve_parser.add_argument('firstname', type=str, help='first name')
retrieve_parser.add_argument('lastname', type=str, help='last name')
api.retrieve_user(args.username, args.firstname, args.lastname)
NEW EDIT/ADDITION OF args = parser.parse_args() 使用这两个命令来反映下面的注释。
args = parser.parse_args()
print(args)
if __name__ == '__main__':
main()
等等...
我的问题是终端没有打印新解析器的帮助命令(例如retrieve_parser、update_parser等)。我必须为每个部分创建一个 "args = parser.parse_arg()" 吗?
其次,我是否在 "parser.parse..." 的位置创建了一个 "args = create_parser.parse_args()" 我注意到他们在终端上打印了两种不同的东西。
非常感谢任何有关放置 parse_arg() 方法的位置的说明(考虑到 API() 函数的使用)!!
通常在创建 parser
(包括任何子解析器)之后调用 parse_args
方法,然后才需要使用生成的命名空间(通常称为 args
).
retrieve_parser.add_argument('lastname', type=str, help='last name')
args = parser.parse_args() # <=========
api.retrieve_user(args.username, args.firstname, args.lastname)
parse_args
的目的是读取 sys.argv
列表(shell/interpreter 从您的命令行创建),并 'parse' 使用您创建的规范add_argument
等等。
关于子解析器的主要 parser
'knows',并将 argv 列表传递给适当的子解析器(由 'retrieve_user' 等名称选择)。
如果命令行包含 -h
(或 --help
),解析器将显示帮助消息并退出。此消息列出了子解析器,但不显示它们的参数。如果 -h
跟在子解析器名称之后,它将是显示帮助的子解析器。
python main.py -h # main help
python main.py retrieve_user -h # subparser help
parser.print_help()
可以在您的代码中使用以显示相同的帮助消息。 retrieve_parser.print_help()
将对子解析器执行相同的操作。显然,这些命令仅在 main
内有效,并且在调试(而非生产)时更有用。
argparse
中没有规定显示所有子解析器的帮助。但是,您可以从我刚才描述的 print_help
命令构造这样一个函数。可能有这样一个功能的 SO 答案(但我不知道什么是好的搜索词)。
粗略地说,main()
可能包括:
parser.add_argument('--bighelp', action='store_true', help='show help for all subparsers')
....
if args.bighelp:
parser.print_help()
subparser1.print_help()
subparser2.print_help()
....
sys.exit(1) # if want to quit
可以从解析器中获取子解析器列表,但维护您自己的列表可能更容易、更清晰。
我专注于如何使 parser
工作,而不是调用 api
的下一步。
您需要修改 add_subparsers
,添加一个 dest
参数。
subparsers = parser.add_subparsers(dest='cmd',
title='subcommands', description='valid subcommands', help='additional help')
然后在你定义了所有的子解析器之后:
# should call cmd since I have stored `.dest` there e.g.`subparsers = parser.add_subparsers(dest='cmd'...`
args = parser.parse_args()
if args.cmd in ['create_user']: # or just == 'create_user'
api.create_user(args...)
elif args.cmd in ['retrieve_user']:
api.retrieve_user(args...)
argparse 文档展示了如何通过调用简化此过程:
args.subcmdfunc(args)
查看子命令部分的最后两个示例:https://docs.python.org/3/library/argparse.html#sub-commands
无论哪种方式,其思路都是从args
命名空间中找出用户指定了哪个子命令,然后调用正确的api
方法。
请记住 parser.parse_args()
等同于 parser.parse_args(sys.argv[1:])
。因此,无论您使用什么解析器,无论是主要解析器还是子解析器之一,它都必须准备好处理您的用户可能提供的所有字符串。它是知道如何处理子解析器名称的主解析器。子解析器只需处理其名称后面的字符串。如果给出完整的 argv[1:]
列表,它可能会出错。所以通常你不会为特定的子解析器调用 parse_args
。
对使用 argparse 和 cmd 行非常陌生。我已经开始构建一个允许前端用户通过 cmd 终端输入数据的解析器。解析器正在调用我创建的 API() class(创建 SQLALCHEMY 会话等),此处显示示例:
class API(object):
def __init__(self):
# all the session / engine config here
def create_user(self, username, password, firstname, lastname, email):
new_user = User(username, password, firstname, lastname, email)
self.session.add(new_user)
self.session.commit()
print(username, firstname, lastname)
def retrieve_user(self, username, firstname, lastname):
# code here ... etc .
在此处的CMD文件中实现:
def main():
parser = argparse.ArgumentParser(prog='API_ArgParse', description='Create, Read, Update, and Delete (CRUD) Interface Commands')
subparsers = parser.add_subparsers(
title='subcommands', description='valid subcommands', help='additional help')
api = API() # calling the API class functions/engine
# Create command for 'user'
create_parser = subparsers.add_parser('create_user', help='create a user')
create_parser.add_argument('username', type=str, help='username of the user')
create_parser.add_argument('password', type=str, help='password')
create_parser.add_argument('firstname', type=str, help='first name')
create_parser.add_argument('lastname', type=str, help='last name')
create_parser.add_argument('email', type=str, help='email address')
#args = parser.parse_args() <--EDIT:removed from here and placed on bottom
api.create_user(args.username, args.password, args.firstname, args.lastname, args.email)
# Retrieve command for 'user'
retrieve_parser = subparsers.add_parser('retrieve_user', help='retrieve a user')
retrieve_parser.add_argument('username', type=str, help='username')
retrieve_parser.add_argument('firstname', type=str, help='first name')
retrieve_parser.add_argument('lastname', type=str, help='last name')
api.retrieve_user(args.username, args.firstname, args.lastname)
NEW EDIT/ADDITION OF args = parser.parse_args() 使用这两个命令来反映下面的注释。
args = parser.parse_args()
print(args)
if __name__ == '__main__':
main()
等等...
我的问题是终端没有打印新解析器的帮助命令(例如retrieve_parser、update_parser等)。我必须为每个部分创建一个 "args = parser.parse_arg()" 吗? 其次,我是否在 "parser.parse..." 的位置创建了一个 "args = create_parser.parse_args()" 我注意到他们在终端上打印了两种不同的东西。
非常感谢任何有关放置 parse_arg() 方法的位置的说明(考虑到 API() 函数的使用)!!
通常在创建 parser
(包括任何子解析器)之后调用 parse_args
方法,然后才需要使用生成的命名空间(通常称为 args
).
retrieve_parser.add_argument('lastname', type=str, help='last name')
args = parser.parse_args() # <=========
api.retrieve_user(args.username, args.firstname, args.lastname)
parse_args
的目的是读取 sys.argv
列表(shell/interpreter 从您的命令行创建),并 'parse' 使用您创建的规范add_argument
等等。
关于子解析器的主要 parser
'knows',并将 argv 列表传递给适当的子解析器(由 'retrieve_user' 等名称选择)。
如果命令行包含 -h
(或 --help
),解析器将显示帮助消息并退出。此消息列出了子解析器,但不显示它们的参数。如果 -h
跟在子解析器名称之后,它将是显示帮助的子解析器。
python main.py -h # main help
python main.py retrieve_user -h # subparser help
parser.print_help()
可以在您的代码中使用以显示相同的帮助消息。 retrieve_parser.print_help()
将对子解析器执行相同的操作。显然,这些命令仅在 main
内有效,并且在调试(而非生产)时更有用。
argparse
中没有规定显示所有子解析器的帮助。但是,您可以从我刚才描述的 print_help
命令构造这样一个函数。可能有这样一个功能的 SO 答案(但我不知道什么是好的搜索词)。
粗略地说,main()
可能包括:
parser.add_argument('--bighelp', action='store_true', help='show help for all subparsers')
....
if args.bighelp:
parser.print_help()
subparser1.print_help()
subparser2.print_help()
....
sys.exit(1) # if want to quit
可以从解析器中获取子解析器列表,但维护您自己的列表可能更容易、更清晰。
我专注于如何使 parser
工作,而不是调用 api
的下一步。
您需要修改 add_subparsers
,添加一个 dest
参数。
subparsers = parser.add_subparsers(dest='cmd',
title='subcommands', description='valid subcommands', help='additional help')
然后在你定义了所有的子解析器之后:
# should call cmd since I have stored `.dest` there e.g.`subparsers = parser.add_subparsers(dest='cmd'...`
args = parser.parse_args()
if args.cmd in ['create_user']: # or just == 'create_user'
api.create_user(args...)
elif args.cmd in ['retrieve_user']:
api.retrieve_user(args...)
argparse 文档展示了如何通过调用简化此过程:
args.subcmdfunc(args)
查看子命令部分的最后两个示例:https://docs.python.org/3/library/argparse.html#sub-commands
无论哪种方式,其思路都是从args
命名空间中找出用户指定了哪个子命令,然后调用正确的api
方法。
请记住 parser.parse_args()
等同于 parser.parse_args(sys.argv[1:])
。因此,无论您使用什么解析器,无论是主要解析器还是子解析器之一,它都必须准备好处理您的用户可能提供的所有字符串。它是知道如何处理子解析器名称的主解析器。子解析器只需处理其名称后面的字符串。如果给出完整的 argv[1:]
列表,它可能会出错。所以通常你不会为特定的子解析器调用 parse_args
。