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型列表,其他类型的列表可以参考上面的连接

这次就分享这么多,有什么遗漏的欢迎大家补充。

 

posted on 2019-12-05 18:48  江南烟雨尘  阅读(1185)  评论(3编辑  收藏  举报

导航