argparse是python中内置的命令行解析模块,内置于python,导入即可使用。
import argparse
parser = argparse.ArgumentParser()
print(parser.parse_args())
保存为parser-tools.py,命令行运行:
>python parser-tools.py -h
usage: parser-tools.py [-h]
optional arguments:
-h, --help show this help message and exit
argparse.ArgumentParser是创建一个参数解析实例,参数description指定帮助中程序的描述信息,prog指定帮助信息中的程序名称,epilog可以指定帮助信息最下面的帮助信息。
参数可以分为位置参数和选项参数:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-a", "--arg1", "--arg2")
parser.add_argument("-b", type = int, default = 10)
parser.add_argument("c")
print(parser.parse_args())
上例中a和b是选项参数,c是位置参数。区别在于是否以"-"开头,另外可以对一个参数指定多个标识符,所以a参数可以用arg1或者arg2来指定。此时的帮助信息如下:
>python parser-tools.py -h
usage: parser-tools.py [-h] [-a ARG1] [-b B] c
positional arguments:
c
optional arguments:
-h, --help show this help message and exit
-a ARG1, --arg1 ARG1, --arg2 ARG1
-b B
type指定参数的类型,可以知道选项参数b是整数类型(默认是字符型)。另外还可以使用default值,当不指定一个参数的时候,参数就会使用此默认值。
>python parser-tools.py --arg2 a-string -b 1 c-string
Namespace(arg1='a-string', b=1, c='c-string')
可以发现,a参数解析为"a-string",b参数解析为用1,c是位置参数,此时指定为"c-string"。
a和b不指定的时候就是使用默认值,如果没有指定default,就会使用default的默认值None:
>python parser-tools.py 1
Namespace(arg1=None, b=10, c='1')
当不指定a和b时,a因为没有指定默认值为None,b使用默认值10。
nargs可以指定一个参数接受多少个数据:
N:一个整数,代表指定的个数;
*:接受任意个参数,包括零个,结果是一个列表;
?:零个或一个;
+:至少一个,否则报错;
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-d", nargs="?", const="d const value", default="d default value")
parser.add_argument("-e", action="store_const", const="e const value", default="e default value")
parser.add_argument("-f", nargs="*")
print(parser.parse_args())
由于?代表接受0个或1个参数,当指定了参数但是没有传参数值时,如果此时设置了const值,那么此时就会使用const的值。
>python parser-tools.py -d -f
Namespace(d='d const value', e='e default value', f=[])
可以发现在指定d参数但是不传入具体的参数值时,那么就会使用const的值,e参数由于没有指定,因此使用默认值,f参数时定义的任意个值,由于也没有传值给它,所以是一个空列表。
const在nargs是"?"或者action是”store_const“等值的时候是有用的,比如:
>python parser-tools.py -d -e -f 1 3 str
Namespace(d='d const value', e='e const value', f=['1', '3', 'str'])
可以发现e参数的action就是store_const,结果在指定e参数后,其值就是使用的const值。
action是在接收到命令行参数后如何处理参数值,默认情况下是存储值,比如上例中的f,传入了三个参数1 3 str,解析结果就是储存了一个包含三者的一个列表。
action可以指定如下:
store_const: 当指定了参数后,会将参数的值解析为const的值;
store_true和store_false:和store_const类似,只不过此时const的值自动就是True或者False;
append: 存储为一个列表,当需要多次使用一个参数时,可以使用;
append_const: 存储为一个列表,并将const的值追加到列表中;
count: 统计一个参数的出现次数;
help: 默认情况下,一个打印帮助的h参数已经自动添加;
version: 打印版本号,需要同时指定version的值;
extend:存储为一个列表,并将每个参数加到列表中。
import argparse
parser = argparse.ArgumentParser()
__VERSION__ = "0.0.1"
parser.add_argument("-v", "--version", action="version", version=__VERSION__)
parser.add_argument("-g", action="append_const", const="const-val")
parser.add_argument("-i", action="count")
print(parser.parse_args())
打印版本号,如下:
>python parser-tools.py -v
0.0.1
如果多次使用一个参数,解析结果如下:
>python parser-tools.py -gg -iii
Namespace(g=['const-val', 'const-val'], i=3)
另外,choices参数指定参数的可选值,required代表必选参数, dest代表参数解析后的变量名。
import argparse
parser = argparse.ArgumentParser(
description="Test sub commond",
prog="Parse-Tools",
epilog="More help message here..."
)
sub_parser = parser.add_subparsers()
sub_a = sub_parser.add_parser("A")
sub_b = sub_parser.add_parser("B")
sub_a.add_argument("-aa", "--A_Arg")
sub_b.add_argument("-bb", "--B_Arg")
print(parser.parse_args())
add_subparsers返回的parser对象,对其添加子命令A和B,每个子命令可以继续添加argument,结果如下:
# 帮助信息
>python parser-tools.py -h
usage: Parse-Tools [-h] {A,B} ...
Test sub commond
positional arguments:
{A,B}
optional arguments:
-h, --help show this help message and exit
More help message here...
# 子命令A帮助信息
>python parser-tools.py A -h
usage: Parse-Tools A [-h] [-aa A_ARG]
optional arguments:
-h, --help show this help message and exit
-aa A_ARG, --A_Arg A_ARG
# 子命令A
>python parser-tools.py A -aa test
Namespace(A_Arg='test')