本文的原文参考https://juejin.im/post/5c6958fd6fb9a049ff4eab60;http://www.liujiangblog.com/blog/16/
当你在服务端(比如linux)要运行一个工具或服务(python文件)时,需要输入参数。如果以命令还来执行就需要写一个命令行参数解析模块。argparse是最常用的python命令行解析器。它支持解析一参数多值,可以自动生成help命令和帮助文档,支持子解析器,支持限制参数取值范围等等功能。
使用步骤
我们常常可以把argparse的使用简化成下面四个步骤
- import argparse #首先导入该模块;
- parser = argparse.ArgumentParser() #然后创建一个解析对象
- parser.add_argument() #然后向该对象中添加你要关注的命令行参数和选项
- parser.parse_args() #最后调用parse_args()方法进行解析,将返回带有某些属性的对象,组成一个类(不太确定)?
例如:
# mytest.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()
print(args.name)
参数种类
必选参数(positional arguments)
例如上面例子中用str
作为参数"name",默认参数是必选参数,命令行运行的时必须输入参数。比如不指定name参数运行python mytest.py
,会报错:
[root@localhost ~]# python mytest.py
usage: mytest.py [-h] name
mytest.py: error: too few arguments
[root@localhost ~]#
必须指定参数运行python mytest.py wangbm
:
[root@localhost ~]# python mytest.py wangbm
wangbm
[root@localhost ~]#
可选参数(optional arguments)
有两种方式:
- 单下划线 - 来指定的短参数,如-h;
- 双下划线 -- 来指定的长参数,如--help
下面给出一个例子:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", help="increase output verbosity")
#定义了一个可选参数 '-v'或者说'--verbosity'
#help="increase output verbosity"给出了可选参数'-v'的help文件描述。
args = parser.parse_args() #通过解析后,其值保存到args.verbosity中。
if args.verbosity:
print ("verbosity turned on")
else:
print ("verbosity turned off")
上面的例子中我们定义了一个可选参数 --verbosity
。在命令行中运行测试得到:
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py
verbosity turned off
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -v 1
verbosity turned on
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -v
usage: arg.py [-h] [-v VERBOSITY]
arg.py: error: argument -v/--verbosity: expected one argument
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -h
usage: arg.py [-h] [-v VERBOSITY]
optional arguments:
-h, --help show this help message and exit
-v VERBOSITY, --verbosity VERBOSITY
increase output verbosity
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py --verbosity 1
verbosity turned on
- 测试直接运行文件,没有输入参数,所以默认的args.verbosity的值应该为0,所以输出 turned off。
- 通过短参数 -v指定参数,并赋值 1,所以打印 turned on。
- 通过短参数 -v指定,但是没有赋值,所以报错,并给出了usage。
- 打印help文件,给出了usage,并展示出了所有的可选参数(-h是函数自动生成的)。
- 通过长参数 --verbosity指定了参数。
参数的数据类型
默认的参数类型为str,如果要进行数学计算,需要对参数进行解析后进行类型转换,如果不能转换则需要报错,这样比较麻烦。
argparse提供了对参数类型的解析,如果类型不符合,则直接报错。如下是对参数进行平方计算的程序:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('x', type=int, help="the base")
args = parser.parse_args()
answer = args.x ** 2
print answer
上面的程序中对参数x
指定了护具类型type=int
。在命令行中进行测试:
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py 2
4
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py two
usage: arg.py [-h] x
arg.py: error: argument x: invalid int value: 'two'
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -h
usage: arg.py [-h] x
positional arguments:
x the base
optional arguments:
-h, --help show this help message and exit
- 输入数字2,得到正确结果
- 输入单词two,数据类型为str不正确,报错。
- 打印帮助信息。
程序用法帮助
前面介绍了为每个参数定义帮助文档,那么给整个程序定义帮助文档该怎么进行呢? 通过创建时候写入description就可以。比如上个例子中,可以定义argparse.ArgumentParser(description="calculate X to the power of Y")。
默认参数值
也可以定义默认参数:
import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], default=1,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1:
print "{}^2 == {}".format(args.square, answer)
else:
print answer
测试结果如下
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py 8
8^2 == 64
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py 8 -v 0
64
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -h
usage: arg.py [-h] [-v {0,1,2}] square
calculate X to the power of Y
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v {0,1,2}, --verbosity {0,1,2}
increase output verbosity
- 没有指定 -v的值,那么取默认值,即1。
- 指定了-v的值为0。
- 打印帮助信息。