6、命令行参数
命令行参数
ArgumentParser对象
prog
usage
parents
prefix_chars
fromfile_prefix_chars
argument_default
add_argument对象
action
nargs
metavar
ArgumentParser对象
prog
usage
parents
prefix_chars
fromfile_prefix_chars
argument_default
add_argument对象
action
nargs
metavar
命令行参数
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 姓名