argparse模块
argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块
使用步骤
import argparse # 导入模块,这个没什么说的
parser = argparse.ArgumentParser() # 实例化一个对象,默认参数一堆,只有description参数可以设置一下
parser.add_argument() # 一次加入每一个参数或选项,主要是这里
parser.parse_args() # 获取参数,用的时候给他赋个值
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')# 先不添加参数args = parser.parse_args() # 打印一下所有参数
上面的例子运行后,由于没有添加任何参数,所以看不出什么。不过可以加上-h 或 --help 运行一下,会显示我们自定义的description的内容,以及默认的help的内容
通过add_argument()方法添加各种参数
添加参数的过程就是,反复调用add_argument()方法,一次加入一个参数。另外加入参数的同时,help的内容也会自动添加。
位置参数
import argparseparser = argparse.ArgumentParser() # 这里的关键参数去掉了,看看和刚才比缺少了什么parser.add_argument('echo') # 添加一个位置参数args = parser.parse_args()print(args.echo) # 获取参数,打印出来print(args) # 看看整个的内容
此时再运行程序,会提示你缺少参数。必须带上一个参数运行,比如test.py arg_test
。并且后面的参数只能是1个,就是不能多也不能少。
此时再次使用-h 或 --help 看一个帮助,会自动加上添加的参数,但是只有参数名,并没有说明
添加参数说明
调用add_argument()方法是,设置关键参数help,来添加参数说明
import argparseparser = argparse.ArgumentParser(description='解析命令行参数') # 把这个说明也加上parser.add_argument('echo', help='直接打印这个参数的值') # 为参数添加说明args = parser.parse_args()print(args.echo) # 获取参数,打印出来print(args) # 看看整个的内容
此时再看一下help
设置参数的数据类型
所有的参数输入都是str类型,如果需要使用int类型的参数,通过关键参数type可以方便的实现
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')parser.add_argument('echo', help='直接打印这个参数的值', type=int)args = parser.parse_args()print(args.echo, type(args.echo)) # 获取参数,打印出来print(args) # 看看整个的内容
现在关键参数必须是数字,而且调用的时候显示的类型也是int类型了
使用文件作为参数
还是上面的type参数,可以设定type值为文件,比如: type=argparser.FileType('r'))
直接对文件进行操作。下面是参数直接输入一个文件路径后打印文件内容的例子:
import argparseparser = argparse.ArgumentParser()parser.add_argument('file', type=argparse.FileType('r')) # 读取文件args = parser.parse_args()# 打印文件内容for line in args.file: print(line.strip())
将参数赋值给了位置参数'file',所以args.fine就是文件句柄,并且按type的要求打开了文件
定义默认值
从刚才开始必须要带参数才能运行程序了,可以通过设置默认值来解决不带参数启动的问题
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')parser.add_argument('echo', help='直接打印这个参数的值', type=int, default=0, nargs='?')args = parser.parse_args()print(args.echo, type(args.echo)) # 获取参数,打印出来print(args) # 看看整个的内容
现在不带参数也可以正常启动程序了,如果不跟参数,默认设置为default的值。这个用default='0'
也是一样的哦,因为前面定义了type。但是如果没有定义type,那么用default=1
的话传输的参数是int,但是你自己自定义参数的话,就无法传入int类型了。
nargs的作用是用来限定输入这个参数的个数,默认情况下我们必须输入1个,使用'?'的话,就是允许不输入或者输入一个。'+'的话表示是1个或多个,也可以使用数字或者'*' 就是允许多个参数,此时所有参数将组成一个列表,就是设为1也就一个列表和默认的情况不一样
参数候选值
使用choise关键参数,可以限定这个参数的值必须在候选的列表内。
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')parser.add_argument('echo', choices=['a', 'b', 'c'], default='a', nargs='?')args = parser.parse_args()print(args.echo, type(args.echo)) # 获取参数,打印出来print(args) # 看看整个的内容
这样只有输入正确才能正常执行,这里注意,如果有default,那么default的值也得再候选值之中。
选项参数
像-h 和 --help 一样,也可以设置自己的选项参数。设置的时候短参数和长参数可以值设置一个,如果没有冲突的话建议都写上。另外上面讲过的那些关键参数,比如说明、默认值、候选值都可以使用
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')parser.add_argument('-v', '--verbose', help='increase verbosity')args = parser.parse_args()print(args.verbose, type(args.verbose)) # 获取参数,打印出来print(args) # 看看整个的内容
如果有长参数,取值的时候就是使用长参数的名字取值。只有短参数的情况下才是用短参数的名字取值。当然也可以指定一个别的变量名。
和位置参数相反,选项参数默认是非必须。不输入选项的情况下取到的值是None,输入选项但是又没在后面写值而且也没默认值,则会出错。
如果需要,也可以将选项设置为必须输入。
指定选项参数的变量名
就如上面讲的,执行选项参数的变量名
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')parser.add_argument('-v', '--verbose', help='increase verbosity', dest='ver') # 用dest来指定变量名args = parser.parse_args()print(args.ver, type(args.ver)) # 获取参数,打印出来。这里的变量名是自己在dest里指定的了print(args) # 看看整个的内容
选项参数-设为必须
使用required=True
后,这个选项就不再是可选的了,而是必须输入
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')parser.add_argument('-v', '--verbose', help='increase verbosity', required=True)args = parser.parse_args()print(args.verbose, type(args.verbose)) # 获取参数,打印出来print(args) # 看看整个的内容
选项参数-布尔值或固定值
上面使用可选参数的时候,必须在后面给这个参数赋值。有时候我只需要一个标识而不需要一个确切的值,比如-h 和 --help。这个可以通过使用action="store_true"
来实现。
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')parser.add_argument('-v', '--verbose', help='increase verbosity', action='store_true')args = parser.parse_args()print(args.verbose, type(args.verbose)) # 获取参数,打印出来print(args) # 看看整个的内容
此时你带参数运行,取到的值就是True,如果不带参数运行,取到的值就是False
也可以使用action="store_false"
,则正好相反
另外也可以是指定一个常量,类似action='store_const', const="Test"
,那么没有-v 值是None,有-v 的值就是"Test" ,此时-v后面不能跟值了,如果有则会被当做是位置参数处理。
默认的设置是 action="store'"
存储参数值。
action关键参数的其他用法-计数和追加
上面的关键参数action是参数值赋予的方式,除了上面的用法,还可以设置为下面的值,一般用的不多
如果是 'count' 表示将参数出现的次数作为参数的值
如果是 'append' 表示将每次出现的该参数后的值都存入同一个数组再赋值
import argparseparser = argparse.ArgumentParser(description='解析命令行参数')parser.add_argument('-c', '--count', help='参数值是这个参数出现的次数', action='count')parser.add_argument('-a', '--append', help='参数是一个列表,每次添加一个元素', action='append')args = parser.parse_args()print(args) # 看看整个的内容
分别使用下面的命令执行测试效果
python test.py -cpython test.py -ccc # 和下面的那个一样python test.py -c -c -cpython test.py -a Apython test.py -a A -a B
将输出转化为字典
上面的例子中每次打印的都是我们设置过的对象,可以使用内置函数,将参数和值转化为字典的形式 print(vars(args))
。
在程序中使用
虽然一般都是用在调用程序的时候指定一些参数,但是在程序内部也可以调用的。应该没什么用
import argparseparser = argparse.ArgumentParser()parser.add_argument('echo', help='直接打印这个参数的值', nargs='*') # nargs要设一下,否则默认启动程序都有一个参数# 上面设了*,启动程序时可以有任意个参数,不过都没有,因为到下面会被Hello替代args = parser.parse_args() # 这样赋值后的args是传不了参数的# args = parser.parse_args # 可以这样,然后可以在后面再写上括号或者括号里填上参数string = parser.parse_args(['Hello']) # 还是直接使用吧,得把所有的参数写成列表print(string) # 分开写,看清楚一点。
总结
大概就是上面这些了,类型Linux命令行那样的命令应该都可以方便的写出来了,而且还自动添加help。就整理这些吧,常用的应该都有了,如果还不够用那就再查吧。最后使用的时候记得写到函数里:
import argparse# 封装到函数里def parse_args(): # 先实例化 parser = argparse.ArgumentParser(description='解析命令行参数') # 依次添加每一个参数 parser.add_argument('echo', help='直接打印这个参数的值') parser.add_argument('num', help='这是个整数', type=int, default=0, nargs='?') parser.add_argument('-v', '--verbose', help='increase verbosity') # 最后返回 return parser.parse_args()if __name__ == '__main__': # 这里直接调用上面的函数 args = parse_args() print(args)