如何基于用户输入通过Python Argparse输出不同帮助描述
解决argparse实现分命令帮助输出的问题
需求说明
需要实现:
- 执行
python httpc.py -h时输出通用帮助信息 - 执行
python httpc.py get -h(或python httpc.py -h get)时输出GET命令的帮助信息 - 执行
python httpc.py post -h(或python httpc.py -h post)时输出POST命令的帮助信息
原代码将所有帮助文本合并输出,不符合需求,需通过argparse的子命令功能改造。
改造方案
利用argparse的subparsers子命令解析器,为每个命令(get/post)创建独立的子解析器,分别绑定对应的帮助文本和参数,实现不同命令的独立帮助输出。
翻译后的帮助文本
general_help = '''httpc 是一个类curl的工具,但仅支持HTTP协议。 用法: httpc 命令 [参数] 可用命令: get 发送HTTP GET请求并打印响应。 post 发送HTTP POST请求并打印响应。 help 显示此帮助界面。 使用 "httpc help [命令]" 获取指定命令的详细信息。 ''' get_help = '''用法: httpc get [-v] [-h key:value] URL Get命令用于向指定URL发送HTTP GET请求。 -v 打印响应详情,包括协议、状态码和响应头。 -h key:value 为请求添加自定义请求头,格式为'key:value'。 ''' post_help = '''用法: httpc post [-v] [-h key:value] [-d 内联数据] [-f 文件路径] URL Post命令用于向指定URL发送HTTP POST请求,支持内联数据或文件内容作为请求体。 -v 打印响应详情,包括协议、状态码和响应头。 -h key:value 为请求添加自定义请求头,格式为'key:value'。 -d 字符串 将内联字符串作为POST请求的请求体。 -f 文件路径 将指定文件的内容作为POST请求的请求体。 注意:-d 和 -f 参数不能同时使用。 '''
完整改造代码
import argparse from argparse import RawTextHelpFormatter general_help = '''httpc 是一个类curl的工具,但仅支持HTTP协议。 用法: httpc 命令 [参数] 可用命令: get 发送HTTP GET请求并打印响应。 post 发送HTTP POST请求并打印响应。 help 显示此帮助界面。 使用 "httpc help [命令]" 获取指定命令的详细信息。 ''' get_help = '''用法: httpc get [-v] [-h key:value] URL Get命令用于向指定URL发送HTTP GET请求。 -v 打印响应详情,包括协议、状态码和响应头。 -h key:value 为请求添加自定义请求头,格式为'key:value'。 ''' post_help = '''用法: httpc post [-v] [-h key:value] [-d 内联数据] [-f 文件路径] URL Post命令用于向指定URL发送HTTP POST请求,支持内联数据或文件内容作为请求体。 -v 打印响应详情,包括协议、状态码和响应头。 -h key:value 为请求添加自定义请求头,格式为'key:value'。 -d 字符串 将内联字符串作为POST请求的请求体。 -f 文件路径 将指定文件的内容作为POST请求的请求体。 注意:-d 和 -f 参数不能同时使用。 ''' # 创建主解析器 parser = argparse.ArgumentParser(description=general_help, formatter_class=RawTextHelpFormatter) parser.add_argument("--port", help="服务器端口", type=int, default=80) # 创建子命令解析器 subparsers = parser.add_subparsers(dest='command', required=True, help='可选的HTTP命令') # 配置GET子命令 get_parser = subparsers.add_parser('get', help=get_help, formatter_class=RawTextHelpFormatter) get_parser.add_argument("URL", help="请求目标URL", type=str) get_parser.add_argument("-v", help="开启详细输出模式", action="store_true") get_parser.add_argument("-h", "--header", dest='headers', help="自定义请求头,格式为'key:value'", type=str, action='append') # 配置POST子命令 post_parser = subparsers.add_parser('post', help=post_help, formatter_class=RawTextHelpFormatter) post_parser.add_argument("URL", help="请求目标URL", type=str) post_parser.add_argument("-v", help="开启详细输出模式", action="store_true") post_parser.add_argument("-h", "--header", dest='headers', help="自定义请求头,格式为'key:value'", type=str, action='append') post_parser.add_argument("-d", help="内联请求体数据", type=str) post_parser.add_argument("-f", help="读取文件作为请求体", type=str) args = parser.parse_args() # 参数校验:POST的-d和-f不能同时存在 if args.command == 'post' and args.d is not None and args.f is not None: parser.error("-d 和 -f 参数不能同时使用")
效果验证
- 执行
python httpc.py -h:输出通用帮助信息 - 执行
python httpc.py get -h:输出GET命令的专属帮助 - 执行
python httpc.py post -h:输出POST命令的专属帮助
内容的提问来源于stack exchange,提问作者Jennifer
相关产品推荐
相关产品推荐

