argparse的点点滴滴

argparse是一个Python模块:命令行选项、参数和子命令解析器。

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 - 当参数在命令行中出现时使用的动作基本类型。

  1. 指定action='store_true'或者‘store_False’之后,在运行程序添加参数时直接输入变量名,可以省略对应的默认值True或者False 
  2. action=’append’ 将相同参数的不同值保存在一个list中                                                                                                        
  3. action=’count’ 统计该参数出现的次数                                                                                                                                  
  4. action=’help’ 输出程序的帮助信息                                                                                                                                   
  5. 除了上述几种预置action,还可以自定义action,需要继承Action并覆盖callinit方法。                                                   

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, ..} 的形式表示子命令

备注:参数解析的另一种方式:使用sys.argv参数

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

 

你可能感兴趣的:(python)