Python标准库系列-argparse
Python 3提供了一系列标准库,所提供的组件设计范围十分广泛。这个标准库包含了多个内置模块(以C编写),Python可以依靠这些标准库提供许多系统级功能,例如文件I/O,此外还有大量以Pyhon编写的模块,提供了许多日常编程中许多问题的标准解决方案。具体的列表可以点击Python标准库了解。
今天提供的就是argparse
这个标准库的使用说明
argparse
在命令行内,我们调用一个函数,一般会有函数名,位置参数和可选参数。比如ls
指令
ls
ls directory
ls -l
ls --help
其中directory
就是位置参数,-l
就是可选参数,以及一个帮助的--help
参数
基本用法
先从一个最简单的例子开始
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
下面是代码运行结果
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]
optional arguments:
-h, --help show this help message and exit
$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
程序运行情况如下:
在没有任何选项的情况下运行脚本不会在标准输出显示任何内容。这没有什么用处
。第二行代码开始展现出
argparse
模块的作用。我们几乎什么也没有做,但已经得到一条很好的帮助信息。--help
选项,也可缩写为-h
,是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。指定任何内容都会导致错误。即便如此,我们也能直接得到一条有用的用法信息。
接下来我们来分别探究位置参数和可选餐具
位置参数
位置参数的添加只需要添加指代信息就可以了。比如
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('echo', help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
help可以做出系统提示,便于对参数含义的推断
这时候运行prog.py
·就必须提供一个参数作为echo
的值,不然系统就好提示报错
$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python3 prog.py foo
foo
参数的输入默认都是字符串形式,需要修改的可以用type指明
parser.add_argument("square", help="display a square of a given number",type=int)
可选参数
可选参数有两种。一种是指定一个参数,一种是只需要知道True/False。我们也分别有两种方法
指定参数
我们需要添加一个--verbosity
的参数,并希望函数打印出来
import argparse
parser = argparse.ArgumentParse()
parser.add_argument('--verbosity', help='increse output verbosity')
args = parser.parse_args()
if args.verbosity:
print(args.verbosity)
这种类型的参数必须指定一个值,不然就会报错。如果不添加这个参数,这个变量就是None
,所以可以判断逻辑真假。如果指定了任何值,逻辑判断都会是真。
二元参数
很多时候我们希望只有真/假两个参数,这时我们可以这样写代码
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', help='show output verbosity', action='store_true')
args = parser.parse_args()
if args.verbose:
print('verbosity turned on')
这种情况下,选项更多的是一个标志,而非接受一个值。这就意味着,当选项存在时,args.verbose
就是真,否则隐式的赋值为假。这时如果指定值,就会报错。
进阶操作
现在我们已经看到了基本的参数设置。接下来我们来一些进阶操作
短选项
有时我们的可选参数命名太长,我们可以用首字母或缩写来提供短选项。
parser.add_argument("-v", "--verbose", help="increase output verbosity",action="store_true")
控制可以接受的值
我们可以提供可以接受的值范围来使得我们的程序不至于运算错误
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity")
通过重复使用来计数
argparse
还提供了count功能,这样每一次使用一次可选参数,这个参数的值就+1。但是 如果不使用,该参数为None
parser.add_argument("-v", "--verbosity", action="count",help="increase output verbosity")
可以用default
来解决这个问题
parser.add_argument("-v", "--verbosity", action="count", default=0,help="increase output verbosity")
矛盾选项
add_mutually_exclusive_group()
它允许我们指定彼此相互冲突的选项。 让我们再更改程序的其余部分以便使用新功能更有意义:我们将引入 –quiet 选项,它将与 –verbose 正好相反。这用就不能同时使用两者。
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")
描述功能
可以在一开始就把程序的目的写清楚
import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
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("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^{} == {}".format(args.x, args.y, answer))
这用如果我们不清楚程序的使用方法,我们可以用-h
得到使用文档
$ python3 prog.py --help
usage: prog.py [-h] [-v | -q] x y
calculate X to the power of Y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet
常见使用方法
一般argparse
会在__name__=="__main__"
中使用。将args
传给main(args)
函数,使得结构逻辑和数据分开来。但是如果配置较多较复杂,建议使用其他的配置文件,比如YAML文件来配置深度学习网络的一些参数