python argparse小记
argparse模块是从命令行向程序传参用的,本文参考官网(https://docs.python.org/2/howto/argparse.html)
1.最简单的
import argparse parser = argparse.ArgumentParser() parser.add_argument("echo") args = parser.parse_args() print(args.echo)
运行时程序名加echo的值,如:
python main.py 5
2.上面这样的参数来多了运行时记不住啊,怎么办?给起个名字
import argparse parser = argparse.ArgumentParser() parser.add_argument("--echo") args = parser.parse_args() print(args.echo)
运行时就能区分啦:python 111.py --echo 5
3.好记是好记了,但是不好敲啊,这么长,怎么办?起个缩写
import argparse parser = argparse.ArgumentParser() parser.add_argument("-e", "--echo") args = parser.parse_args() print(args.echo)
这样,每次运行时用缩写就可以了:python 111.py -e 5,当然,现在全称依旧是可以用的
4.仅用一个单词代表一个变量,当时还好,过一段时间,自己的代码自己都不认识了,所以,备注可不能少了,args模块还提供了一个高级玩法:help
import argparse parser = argparse.ArgumentParser() parser.add_argument("-e", "--echo",help="这是一段备注,防止自己的代码自己不认识") args = parser.parse_args() print(args.echo)
这样的好处是什么呢?那就是你不用跑到代码行里去找注释了,用的时候直接:python 111.py -h,就会显示
usage: 111.py [-h] [-e ECHO] optional arguments: -h, --help show this help message and exit -e ECHO, --echo ECHO 这是一段备注,防止自己的代码自己不认识
-h,就是help的缩写,函数自带的参数,注意自己给自定义参数缩写时别冲突了吖。是不是很方便?
5.有没有爱上args函数呢?但是实际使用还是有点麻烦,所有传入的参数都是str类型的,因为python可以自动判断变量类型,开始这样设计时为了方便我们使用,但是有的时候反而不方便,比如,我要传进去数字5,于是:python 111.py -e 5 (代码没变,与4一样)
但是打印一下:
print(type(args.echo)) -------------------------------- 你会发现 <class 'str'>
这也可以理解,5既可以是数字也可以是str,产生了歧义,python君就自作主张,都变成了str,可我明明要数字,每次传参进来我还要手动转换,这也他不智能了叭。别急,你想到的,大神们也想到了,于是加上了类型选择type=:
import argparse parser = argparse.ArgumentParser() parser.add_argument("-e", "--echo",type=int,help="这是一段备注,防止自己的代码自己不认识") args = parser.parse_args() print(type(args.echo))
运行一下>python 111.py -e 5,结果:<class 'int'>,果然好用。
6.但是5中类型定义有一个坑,那就是bool,不管赋值时True还是False,传参进去得到的都是True,这是因为,这个变量在接受到命令行传来的参数以后直接判断是否有值,False倏然表示假,但是他自身也是一个值,于是程序就傻傻的认为有值,于是都是True啦,可是不给他传值,args函数自身的纠错机制会报错,于是~~~。
解决方法也有很多,有兴趣的小伙伴们可以到网上自己找一下,这里我只介绍一种我自己比较常用的,action="True":
import argparse parser = argparse.ArgumentParser() parser.add_argument("-e", "--echo",action="store_true",help="这是一段备注,防止自己的代码自己不认识") args = parser.parse_args() # print(type(args.echo)) print(args.echo)
其他类型都是给个变量名之后必须跟一个值,但是action同学与众不同,只有变量名就管用啦。来试试:
运行 python 111.py -e 得到结果 True
运行 python 111.py 得到结果 False
是不是就完美实现了bool的功能呢?只要思想不滑坡,办法总比困难多。
7.用好前6条,基本的args就可以用起来了,但是,实际应用中总有粗心的小伙伴,参数会出错。小问题,debug嘛,本来生活就在写bug和改bug中平淡的度过了,直到他小手一抖把嫦娥一百号送到了火星。python君感觉这样不行啊,需要帮忙限制一下,只能从‘月球’,‘地球’中选一个,没有‘火星’选项,于是就有了choices选项:
import argparse parser = argparse.ArgumentParser() parser.add_argument("-e", "--echo",type=int,choices=[0,1],help="这是一段备注,防止自己的代码自己不认识") args = parser.parse_args() # print(type(args.echo)) print(args.echo)
这样,你只能从chioces列表中选啦,否则就报错:
111.py: error: argument -e/--echo: invalid choice: '1' (choose from 0, 1)
8.还有一个比较好玩的操作action=‘count’,从字面就可以理解,就是计数:
import argparse parser = argparse.ArgumentParser() parser.add_argument("-e", "--echo",action="count",help="这是一段备注,防止自己的代码自己不认识") args = parser.parse_args() print(args.echo) ----------------------------------------------------------- python 111.py -e 结果:1 python 111.py -eee 结果:3
看懂了吗?就是count你输入了几个e
9.我运行一段代码,大多数情况下参数都是一样的,每次都要敲,好烦。python君也想到了呢,default,比如:
parser.add_argument("-v", "--verbosity", action="count", default=0)
这样,你就给了这个参数默认值0了,以后在输入时可以跳过这个参数了。
10.最后一个知识点,互斥组,就是传参多个bool型变量,只有一个为真,直接上例子吧:
import argparse parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-v", "--verbose", action="store_true") group.add_argument("-q", "--quiet", action="store_true") parser.add_argument("-e", "--echo",action="count",help="这是一段备注,防止自己的代码自己不认识") args = parser.parse_args() print(args.echo)
如果你两个互斥变量都为真 python 111.py -q -v -e
就会报错: 111.py: error: argument -v/--verbose: not allowed with argument -q/--quiet
在if elif选项中来传参很好用哟。
11.有时,需要向程序中传入一个list,args也是可以实现的(参考https://blog.csdn.net/kinggang2017/article/details/94036386)
parser.add_argument("-g", "--gpu_list", type=int, nargs='+', default=[0, 1, 2, 3],
运行时,python 111.py -g 1 2 3来指定列表值,注意,1 2 3之间用space分割。这样能传入int型列表,其他类型的列表可以参考上面的连接
这次就分享这么多,有什么遗漏的欢迎大家补充。