argparse
模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse
将弄清如何从 sys.argv
解析出那些参数。 argparse
模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
argparse
功能如下:
1. 处理可选参数和位置参数
2. 生成 usage messages
3. 支持派生出sub-parsers
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)
prog - 程序的名称(默认:sys.argv[0])
usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
description - 用于展示程序的简要介绍信息,如这个程序可以做什么、怎么做。在帮助信息中 description位于用法信息与参数说明之间(默认值:None)
epilog - 在参数帮助文档之后显示的文本(默认值:None)
parents - 一个 ArgumentParser 对象的列表,它们的参数也应包含在内
formatter_class - 用于自定义帮助文档输出格式的类
prefix_chars - 可选参数的前缀字符集合(默认值:“-”)
fromfile_prefix_chars - 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:None)
argument_default - 参数的全局默认值(默认值: None)
conflict_handler - 解决冲突选项的策略(通常是不必要的)
add_help - 为解析器添加一个 -h/--help 选项(默认值: True)
allow_abbrev - 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)
parser = argparse.ArgumentParser(description='Process some integers.')
ArgumentParser
对象包含将命令行解析成 Python 数据类型所需的全部信息。
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
name or flags - 一个命名或者一个选项字符串的列表,例如 “foo”(此为位置参数) 或“ -f”, “--foo”(此为可选参数)。
action - 当参数在命令行中出现时使用的动作基本类型。
nargs - 命令行参数应当消耗的数目。如-u选项接受2个参数,python prog.py -u 1 2
这时传入的default值也应该是一个list。当选项接受1个或者不需要参数时指定nargs=’?',当没有参数时,会从default中取值。而对于后面需要跟多个参数的情况(–foo a1 a2 a3…),则需要设置nargs=’*’ 。nargs=’+'也和nargs=’*'一样,但是有一个区别当’+'时少于1个参数(没有参数)位置参数会报错误
const - 被一些 action 和 nargs 选择所需求的常数。
default - 当参数未在命令行中出现时使用的值。
type - 使用这个参数,对命令行参数执行类型检查和类型转换,默认是字符串类型
choices - 用来检查输入参数的范围,超出范围则报错。如:choices=[1,3,5]
required - 此命令行选项是否可省略 (若是True则命令行必须得出现此参数)。当某个选项指定要在命令行出现的时候用此参数,默认通过-f –foo指定的参数为可选参数
help - 使用这个参数描述选项作用。
metavar - 在使用方法消息中使用的参数值示例。
dest - 给parse_args()返回的对象要添加的属性名称。如果提供dest,例如dest="a",那么可以通过args.a访问该参数 。dest 允许自定义ArgumentParser的参数属性名称
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
给一个 ArgumentParser
添加程序参数信息是通过调用 add_argument()
方法完成的
# 小栗子
parser.add_argument('-b', type=int, default=[7,8,9], metavar='n', nargs=3)
args = parser.parse_args()
print(args.b)
"""
执行:python args.py -b 1 2 3
输出结果
[1,2,3]
"""
ArgumentParser.parse_args(args=None, namespace=None)¶
args- 参数名称。
namespace- 赋值。
parse_args()是将之前add_argument()定义的参数进行赋值,并返回相关的namespace。
在脚本中,通常 parse_args()
会被不带参数调用,而 ArgumentParser
将自动从 sys.argv
中确定命令行参数。
import argparse
# (1) 声明一个parser
parser = argparse.ArgumentParser()
# (2) 添加参数
# 若是使用name则是当做位置参数来使用 根据命令行先后顺序
# 若是使用flags(如--foo)则是当成可选参数使用 需要制定参数关键字 以空格间隔开
parser.add_argument("parg") # 位置参数,这里表示第一个出现的参数赋值给parg
parser.add_argument("--digit",type=int,help="输入数字") # 通过--xxx 声明的参数,为int类型
parser.add_argument("--name",help="名字",default="cjf") # 同上,default 表示默认值
# (3) 读取命令行参数
args = parser.parse_args()
# (4) 调用这些参数
print(args.parg)
print("echo ={0}".format(args.digit))
print("name = {}".format(args.name)
"""
执行:python test.py position_arg --digit 2222
输出:
position_arg
echo =2222
name = cjf
"""
ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, required][, help][, metavar])¶
形参的描述
title - 输出帮助的子解析器分组的标题;如果提供了描述则默认为 "subcommands",否则使用位置参数的标题
description - 输出帮助中对子解析器的描述,默认为 None
prog - 将与子命令帮助一同显示的用法信息,默认为程序名称和子解析器参数之前的任何位置参数。
parser_class - 将被用于创建子解析器实例的类,默认为当前解析器类(例如 ArgumentParser)
action - 当此参数在命令行中出现时要执行动作的基本类型,若没出现则使用默认值
dest - 将被用于保存子命令名称的属性名;默认为 None
即不保存任何值
required - 是否必须要提供子命令,默认为 False
(在 3.7 中新增)
help - 在输出帮助中的子解析器分组帮助信息,默认为 None
metavar - 帮助信息中表示可用子命令的字符串;默认为 None
并以 {cmd1, cmd2, ..} 的形式表示子命令
import sys
if len(sys.argv) != 4:
print('Usage:')
print('python train.py datacfg cfgfile weightfile')
exit()
# sys.argv[0]为python脚本名
# datacfg = sys.argv[1]
# cfgfile = sys.argv[2]
# weightfile = sys.argv[3]
参考资料
https://blog.csdn.net/guoyajie1990/article/details/76739977
https://docs.python.org/zh-cn/3/library/argparse.html?highlight=argparse#dest