python中的参数解析

it2022-05-05  131

1. argparse

1.1 定位参数

argparse是一个命令行参数解析模块,即可以在命令行执行python文件时传入参数。

简单案例(定位参数,定位参数在命令行执行时必须传入):在test_parser.py文件中写入以下代码 import argparse parser = argparse.ArgumentParser() # 创建参数对象,类似于创建一个类 parser.description = '数乘运算' # 添加描述信息,--help时的提示信息,正常执行文件不会显示,或者将description='数乘运算'放到ArgumentParser中 parser.add_argument('A', help='I am A', type=int) # 添加参数,type指定参数的类型,不写默认为string parser.add_argument('B', help='I am B', type=int) # 添加参数,type指定参数的类型,help是执行文件--help的提示 args = parser.parse_args() # 类似于类的实例化,解析对象 muti = args.A * args.B print(muti)

在命令行执行,如下所示: 由于代码中,指定了type=int,因此命令行执行文件时,传入的参数必须为int型。如果代码中未指定type则在命令行输入python test_parser.py 2 3时认为2 和 3都是string类型,因此报错。

1.2 可选参数

import argparse def main(): parser = argparse.ArgumentParser(description="Demo of argparse") parser.add_argument('-n','--name', default='Lucy') parser.add_argument('-s','--sex', default='女') args = parser.parse_args() print(args) name = args.name sex = args.sex print('Hello {} {}'.format(name,sex)) if __name__ == '__main__': main()

可选参数,使用-f或者–f表示。上述代码中,增加了两个可选参数name和sex。其中-‘n’,’-name’表示同一个参数,default表示在命令行运行时没有提供参数,程序会将default的值作为参数。 当’-’, '–'同时出现时,系统默认后者为参数名,前者不是(写代码时),但是在命令行输入的时候没有这个区别,使用-n 或者 -name都行

1.3 定位参数与可选参数混合使用

import argparse def main(): parser = argparse.ArgumentParser(description="Demo of argparse") parser.add_argument('-n','--name', default='Lucy') parser.add_argument('-s','--sex', default='female') parser.add_argument('age') args = parser.parse_args() print(args) name = args.name sex = args.sex print('Hello {} {}'.format(name, sex), args.age) if __name__ == '__main__': main()

如果定位参数和可选参数混合使用,在命令行执行时,首先应该写入定位参数,人后再写可选参数。(和def fun()中fun里面需要先写位置参数,再写关键字参数类似)

1.4 add_argument参数解析

name or flag:定位参数和可选参数的名称,注意如果-n和–name同时出现,则认为name为可选参数名称。-n是–name的简写,因此解析时必须用全称,但命令行执行时简称、全称都可以。default:对于可选参数,如果命令行执行时未指明可选参数的值,则可选参数默认为default的值;如果命令行指定可选参数值,则可选参数即命令行指定的值。对于定位参数不适用。help:无论可选参数还是定位参数,都是在命令行执行–help时显示的提示内容。type:指定传入参数的类型。在命令行执行时传入的参数也必须是type指定的类型。如果不写,则命令行传入的参数无论写2还是a都默认为string。参数解析时会自动将2和a转换成stringnargs: 1> ‘*’:所有当前命令行参数被聚集到一个列表中(定位参数一个列表,可选参数一个列表)通过 nargs=’*'来实现多个位置参数通常没有意义,但是多个选项是可能的(下例中,由于没有指定type,故列表中的1,23也是字符串) parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', nargs='*') parser.add_argument('--name', nargs='*') args = parser.parse_args() print(args.integers) print(args.name)

2> + : '+'和 ‘*’ 类似,所有当前命令行参数被聚集到一个列表中。另外,当前命令行没有参数时会产生一个错误信息。后半句话主要针对的是位置参数,当“*”时,命令行没有任何定位参数,结果为一空列表;当+时,命令行没有任何定位参数会报错。对于可选参数,无论“*”还是+,命令行没有任何参数都是None,或者default指定的值 3> N:(一个整数)。命令行中的 N 个参数会被聚集到一个列表中

parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', nargs=2) parser.add_argument('my_list', nargs=3) parser.add_argument('--name', nargs=2) args = parser.parse_args() print(args.integers) print(args.my_list) print(args.name)

choice:用于界定参数的取值范围 parser = argparse.ArgumentParser(prog='doors.py') parser.add_argument('door', type=int, choices=range(1, 4)) parser.add_argument('-n', choices=range(1, 4), type=int) args = parser.parse_args() print(args.door) print(args.n)

dest: parse_arg()之后add_argument中返回的变量名称。如下例,对于可选参数,首先指定可选参数名为-n,parse_arg()之后,可选参数的名称就会变为window(类似于window=parse_arg(n)),故下面使用时为args.window。但是命令行时,尚未解析,仍然要写初始化的名称-n才能传入参数。对于定位参数,第一个参数默认就是dest,故下例door是dest=‘door’的简写。 parser = argparse.ArgumentParser() parser.add_argument('door', type=int, choices=range(1, 4)) parser.add_argument('-n', choices=range(1, 4), type=int, dest='window') args = parser.parse_args() print(args.door) print(args.window)

required:用来设置必选参数,设定后在命令行不使用会报错metavar:在命令行所接参数的样式的示例,比如–version后面应接3位大写字母(比如YYY),则可以设定metavar=‘YYY’,意思为此处应接三位大写字母const:是针对于action中的’store_const’与’append_const’而出现。其实对于那些需要接值的参数,预先存储一个值,如果没有则取用这个值action:用来给ArgumenParser对象判断如何处理命令行参数支持的操作如下: 1>‘store’ - 默认的操作,用来存储参数的值 2>‘store_const’ - 适用于可选参数optional arguments,用来存储const关键字指定的值。如下例,对于可选参数,foo存储的值为b,默认为c,在命令行执行时,如果不写–foo则为默认的c,如果写上–foo,则表示调用–foo存储的b,这时只需写–foo表示调用,后不跟任何参数。对于定位参数,命令行执行时什么都不写,会自动调用3,因此default=4在这里无用。注意,这里const后接的值就代表了类型,如2表示int,‘2’表示string,无需再指定type。 parser = argparse.ArgumentParser() parser.add_argument('--foo',action='store_const',const='b',default='c') parser.add_argument('num', action='store_const', const=3, default=4) args = parser.parse_args() print(args.foo) print(args.num)

3>append:存储一个列表,并且将每个参数值追加到列表中。在允许多次使用选项时很有用,仅适用于可选参数。

parser = argparse.ArgumentParser() parser.add_argument('--foo',action='append') args = parser.parse_args() print(args.foo)

append_const:与store_const方法类似,只是这里的const值被放到一个列表里。 parser = argparse.ArgumentParser() parser.add_argument('--foo',action='append_const', const='a') parser.add_argument('num', action='append_const', const=2) args = parser.parse_args() print(args.foo) print(args.num) print(type(args.num[0]))

2. sys.argv

import sys print( '参数个数为:', len(sys.argv), '个参数。') print ('参数列表:', str(sys.argv))

命令行执行结果: $ python test.py 1 2 3 参数个数为: 4 个参数。 参数列表: [‘test.py’, ‘1’, ‘2’, ‘3’]

sys.argv 是命令行参数列表。sys.argv[0] 表示脚本名。 len(sys.argv) 是命令行参数个数。


最新回复(0)