TOC

命令行参数

    argparse是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广,同时argparse也可以让人轻松编写用户友好的命令行接口,argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息;
ArgumentParser对象
    argparse主要就是使用一个ArgumentParser对象,该对象为argparse的主对象,它能将命令行信息解析并保存为python需要的信息及类型,该对象主要有如下几个参数;
prog:程序的名字默认为sys.argv[0],即当前脚本文件名基名;
usage:描述程序使用的方式,此处可以使用%(prog)s,如usage='%(prog)s [option]';
description:查看帮助文档时,在顶部显示的文本,即命令描述,默认值为None;
epilog:查看帮助文档时,在底部显示的文本,即命令简介,默认值为None;
parents:主要用于ArgumentParser对象复用,解决重复编写参数、帮助信息、描述等信息,接受一个列表,元素为ArgumentParser对象;
formatter_class:用于自定义帮助输出的类,一般不用,比如使帮助信息可以多行展示;
prefix_chars:前缀可选参数的标识符,默认值为“-”,比如查看帮助为-h,我们也可以把它修改为'+'或其他标识符;
fromfile_prefix_chars:如果参数较多,可以将参数放在一个文件里面,此处表示文件的标识符,命令行参数标识符为'-',那么文件也可以设定一个标识符;
argument_default:参数的全局默认值,当没传递参数时,默认只为None,如果给定了argparse.SUPPRESS,那么直接抛出对象不存在;
conflict_handler:解决冲突可选项的策略;
add_help:为解析器添加-h/-help选项,默认值为True;
allow_abbrev:如果缩写是明确的,则允许缩短长选项,默认值为True;
# 可用变量
%(prog)s:获得当前程序的名称,取自于prog,如果没有给定prog,默认为脚本基名,整个程序都可以引用该变量;
prog
    prog为程序名称,即当前名称的名称,如果不给定时,默认为当前脚本的文件名,同时,该参数还会提供一个全局变量,即%(prog)s,可以在任何地方引用;
import argparse

parser = argparse.ArgumentParser(prog='cce', description='获取到的程序名为: %(prog)s')  # 查看下面注释
arg = parser.parse_args(['-h'])
---
# usage: cce [-h]
# 
# 获取到的程序名为: cce
# 
# optional arguments:
#   -h, --help  show this help message and exit
usage
    顾名思义,用法的意思,就是提示使用者,这个命令应该怎么使用,遵循什么格式去使用这个命令;
parser = argparse.ArgumentParser(prog='cce', usage='%(prog)s option [value]')  # 查看下面注释
arg = parser.parse_args(['-h'])
---
# usage: cce option [value]
# 
# optional arguments:
#   -h, --help  show this help message and exit
parents
    parents主要是为了解决重复编程的问题,可能我们会初始化一个模版,然后新的argparse对象就继承这个对象下所有信息,类似继承的意思;
# 父
parent_parser = argparse.ArgumentParser(prog='cce', usage='%(prog)s option [value]')  # 查看下面注释
parent_parser.add_argument('-f', '--file', type=argparse.FileType, help='输入文件绝对路径路径')
# 子
child_parser = argparse.ArgumentParser(parents=[parent_parser], add_help=False)
child_parser.add_argument('-n', '--name', type=str, help='输入名称')
# 结果会进行继承
result = child_parser.parse_args(['-h'])
---
# usage: edu.py [-h] [-f FILE] [-n NAME]
# 
# optional arguments:
#   -h, --help            show this help message and exit
#   -f FILE, --file FILE  输入文件绝对路径路径
#   -n NAME, --name NAME  输入名称
prefix_chars
    参数前缀标识符,查看帮助时使用的是'-h',此处前缀标识符为'-',我们也可以使用prefix_chars来修改这个前缀标识符,prefix_chars为一个字符串,可以写多个前缀标识符,但是默认前缀标识符'-'为必须,因为prefix_chars里面的字符串是或者关系,如prefix_chars="-+=',那么使用add_argument时可以用"-"作为前缀标识符,也可以使用'+'或者'='作为前缀标识符,三者都可以,但是,查看帮助为'-h'是不可更改的;
parent_parser = argparse.ArgumentParser(prog='cce', usage='%(prog)s option [value]', prefix_chars='-+=')  # 查看下面注释
parent_parser.add_argument('+f', '++file', type=argparse.FileType, help='输入文件绝对路径路径')
parent_parser.add_argument('=n', '==name', type=argparse.FileType, help='输入名称')
result = parent_parser.parse_args(['-h'])
---
# usage: cce option [value]
# 
# optional arguments:
#   -h, --help            show this help message and exit
#   +f FILE, ++file FILE  输入文件绝对路径路径
#   =n NAME, ==name NAME  输入名称
fromfile_prefix_chars
    当参数较多时,可以放在一个文件里,文件也可以作为参数传递给脚本,但是文件的前缀标识符和命令行参数前缀标识符是需要不一样的,像命令行参数前缀标识符默认是'-',那么文件前缀标识符就可以改为其他标识符,如'@';
    这里需要注意一点的是,文件里面的参数和值不能在同一行;
with open('args', 'w') as fp:
    fp.write('-a\n18\n-n\ncce')

parent_parser = argparse.ArgumentParser(prog='cce', fromfile_prefix_chars='@')  # 查看下面注释
parent_parser.add_argument('-a', '-age', dest='age', type=int)
parent_parser.add_argument('-n', '--name', dest='name', type=str)
result = parent_parser.parse_args(['@args'])  # 等价于 python3.5 cce.py @args
print(result.age, result.name) # 18 cce
argument_default
    全局默认值,当一个参数没传递值时,如果我们获取该参数会返回None,那么如果要它抛出异常,而不是None就需要用到这个argument_default,argparse模块提供了一个SUPPRESS对象,
parent_parser = argparse.ArgumentParser(prog='cce')
parent_parser.add_argument('-a', '-age', dest='age')
result = parent_parser.parse_args() # 当没有传递参数时
print(result.age) # None

parent_parser = argparse.ArgumentParser(prog='cce',argument_default=argparse.SUPPRESS)
parent_parser.add_argument('-a', '-age', dest='age')
result = parent_parser.parse_args()  # 当没有传递参数时
print(result.age) # AttributeError: 'Namespace' object has no attribute 'age'
add_argument对象
    add_argument在ArgumentParser对象的基础之上添加参数的,在使用ArgumentParser创建一个对象之后,就可以使用这个对象的add_argument方法来添加参数,其中add_argument中还有很多可选参数,如下;
选项或标志:名称或选项字符串列表,例如。foo或-f, --foo,可以写多个;
action:在命令行遇到此参数时要执行的操作的基本类型;
    store:只是保存参数的值。这是默认的动作;
    store_const:顾名思义,存储const,如果该参数提供了,就存储const的值,否则值为Null,保存由const关键字参数指出的值,指定该参数时,无需在执行脚本时显示提供value;
    store_true:顾名思义,存储True,如果该参数提供了,就为True,否则False,指定该参数时,无需在执行脚本时显示提供value;
    store_false:顾名思义,存储False,如果该参数提供了,就为False,否则True,指定该参数时,无需在执行脚本时显示提供value;
    append_const:计算关键字参数出现的次数。例如,这可用于增加详细的级别;
    version:一般用于打印版本信息;
nargs:用来指定指定参数的标识符,可以接受几个参数;
    N:N代表个数,表示该标识符接受几个参数;
    ?:参数可有可无;
    +:表示参数最少一个;
    *:表示参数可以有任意个;
const:某些动作和nargs选择所需的常量值;
default:如果参数在命令行中不存在,则生成的值;
type:应转换命令行参数的类型;
choices:参数的允许值的容器,类似枚举;
required:是否可以省略命令行选项(仅针对可选参数);
help:参数的简要说明;
metavar:主要用于美化帮助信息,也可以理解是一种语法提示,需要注意的是,nargs会影响metavar执行多次;
dest:要添加到由parse_args()返回的对象的属性的名称,后面可以使用parse_args生成的对象获取其参数值。
action
    在命令行遇到此参数时要执行的操作的基本类型,根据不同的操作类型执行不同的任务;
parent_parser = argparse.ArgumentParser(prog='cce')
parent_parser.add_argument('-const', dest='const', action='store_const', const='store_const')
parent_parser.add_argument('-true', dest='true', action='store_true')
parent_parser.add_argument('-false', dest='false', action='store_false')
parent_parser.add_argument('-version', action='version', version='%(prog)s 2.0')
print(parent_parser.parse_args(['-const']).const)  # store_const
print(parent_parser.parse_args(['-true']).true)  # True
print(parent_parser.parse_args(['-false']).false)  # False
print(parent_parser.parse_args(['-version']).const)  # cce 2.0
# 下述代码与上述代码不可同时执行,因为有-version的存在
parent_parser = argparse.ArgumentParser(prog='cce')
parent_parser.add_argument('-v', dest='count', action='count')
print(parent_parser.parse_args(['-vvvv']).count)  # 4
nargs
    用来指定指定参数的标识符,可以接受几个参数;
parent_parser = argparse.ArgumentParser(prog='cce')
parent_parser.add_argument('-a', dest='a',nargs=2) # 接受2个参数
parent_parser.add_argument('-b', dest='b',nargs="?",default='1') # 参数可有可无,如果没有使用default
print(parent_parser.parse_args(['-a','12','123']))  # Namespace(a=['12', '123'], b='1')

parent_parser = argparse.ArgumentParser(prog='cce')
parent_parser.add_argument('-a', dest='a',nargs="+") # 至少一个参数
print(parent_parser.parse_args(['-a','12','123']))  # Namespace(a=['12', '123'])

parent_parser = argparse.ArgumentParser(prog='cce')
parent_parser.add_argument('-a', dest='a',nargs="*") # 可以有任意个参数
print(parent_parser.parse_args(['-a','12','123','123','123','123']))  # Namespace(a=['12', '123', '123', '123', '123'])
metavar
    主要用于美化帮助信息,也可以理解是一种语法提示,需要注意的是,nargs会影响metavar执行多次;
parent_parser = argparse.ArgumentParser(prog='cce')
parent_parser.add_argument('-n', '--name', dest='name', nargs=1, metavar=('姓名'))  # 美化帮助信息
print(parent_parser.parse_args(['-h']))  
---
# usage: cce [-h] [-n 姓名]
# 
# optional arguments:
#   -h, --help        show this help message and exit
#   -n 姓名, --name 姓名

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注