python Argparse模块的使用

参考:

Argparse Tutorial:https://docs.python.org/2.7/howto/argparse.html#id1

argparse - Parser for command-line options, arguments and sub-commands:https://docs.python.org/2.7/library/argparse.html?highlight=argparse#module-argparse


#################################################


模块argparse是Python标准库中推荐的命令行解析模块

有两个其他模块也能完成相同的功能,即getopt和optparse模块。其中,argparse是基于optparse模块实现的,因此在用法上也非常相似。


##################################################

基础


最简单的一个例子,编写prog.py:

[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.parse_args()  

python Argparse模块的使用


运行上述脚本并且没有添加任何参数时,输出无结果

添加--help参数时,argparse模块会自动输出帮助信息,这是它的优势(参数--help也可以简化为-h,这两个参数是不需要我们编辑的)

当指定其他参数时报错,即便如此,也可以得到一个有用的用法信息


###############################################################

位置参数

指定位置参数后,程序必须输入该参数值才能运行


修改prog.py脚本:

[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("echo")  
  5. args = parser.parse_args()  
  6. print args.echo  
python Argparse模块的使用

增加add_argument()方法,在这个方法中,我们指定程序将要去接受的命令行选项,在这里我们命名为echo(只是一个名字,可以随意更改)

此时,调用程序需要输入一个参数

方法parse_args()实际上会返回一些选项指定的值,上述例子中,选项为echo

在argparse模块中,当你指定位置参数名为echo时,此时想要提取该参数值,必须指定为args.echo


可以在add_argument()方法中添加help选项以便该位置参数更加明了

[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("echo", help="echo the string you use here")  
  5. args = parser.parse_args()  
  6. print args.echo  
python Argparse模块的使用

一般我们要求输出位置参数是为了以后程序的运算。由于argparse将输入的参数均视为strings类型,而有时我们需要的是int类型,比如

[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("square", help="display a square of a given number")  
  5. args = parser.parse_args()  
  6. print args.square**2  
python Argparse模块的使用

当我们需要输入一个int类型值时,由于默认输入参数值均为str类型,所以出错。此时有两种方法

第一种,在计算过程中转换str为int类型:

[python] view plain copy
  1. print int(args.square)**2  

第二种,可以在add_argument()方法中用关键字type指定输入类型,即可解决:

[python] view plain copy
  1. parser.add_argument("square", help="display a square of a given number", help=int)  

推荐使用第二种


######################################################################33

可选参数


一个简单的例子

[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("--verbosity", help="increase output verbosity")  
  5. args = parser.parse_args()  
  6. if args.verbosity:  
  7.     print "verbosity turned on"  
python Argparse模块的使用

设置可选参数后,程序可以不输入该参数值运行

如果程序运行时要赋值可选参数,必须先指定该可选参数。例如

[python] view plain copy
  1. python prog.py --verbosity hel  

如果程序运行时没有赋值给可选参数verbosity,则相应的args.verbosity也会为空(None)

如果程序使用了可选参数,后面必须跟参数值,不然会报错


默认可选参数会被赋值为str,而在实际情况中,很多时候,可选参数是作为一个标识而不是一个确切的值,仅需要确定是true或false即可,可以指定关键字action,赋值为"store_true"

[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("--verbosity", help="increase output verbosity", action="store_true")  
  5. args = parser.parse_args()  
  6. if args.verbosity:  
  7.     print "verbosity turned on"  
python Argparse模块的使用

这样--verbosity就可以像--help类似,只需输入参数即可


############################################################################3

快捷选项(短选项)

类似命令行用法,长选项总会有相应的短选项,只需在相应的add_argument()方法中加上即可:

[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("-v""--verbose", help="increase verbosity", action="store_true")  
  5. args = parser.parse_args()  
  6. if args.verbose:  
  7.     print "verbosity turned on"  

python Argparse模块的使用


####################################################################

结合使用位置参数(positional arguments)和可选参数(optional arguments)


[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("square", type=int, help="display a square of a given number")  
  5. parser.add_argument("-v""--verbose", action="store_true", help="increase output verbosity")  
  6. args = parser.parse_args()  
  7. answer = args.square**2  
  8. if args.verbose:  
  9.     print "the square of {} equals {}".format(args.square, answer)  
  10. else:  
  11.     print answer  

python Argparse模块的使用


注意,参数顺序没有关系


[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("square", type=int, help="display a square of a given number")  
  5. parser.add_argument("-v""--verbosity", type=int, help="increase output verbosity")  
  6. args = parser.parse_args()  
  7. answer = args.square**2  
  8. if args.verbosity == 2:  
  9.     print "the square of {} equals {}".format(args.square, answer)  
  10. elif args.verbosity == 1:  
  11.     print "{}^2 == {}".format(args.square, answer)  
  12. else:  
  13.     print answer  

python Argparse模块的使用


上述程序中还可改进以下,可以指定可选参数的取值范围,用关键字choices

[python] view plain copy
  1. parser.add_argument("-v""--verbosity", type=int, choices=[0,1,2], help="increase output verbosity")  
python Argparse模块的使用

此处还有另一种方法来执行程序,这也很普遍,并且这种方式匹配CPython可执行程序

[python] view plain copy
  1. parser.add_argument("-v""--verbosity", action="count", help="increase output verbosity")  
python Argparse模块的使用

还可以指定关键字default来指定选项默认的值

[python] view plain copy
  1. parser.add_argument("-v""--verbosity", default=2, action="count", help="increase output verbosity")  
python Argparse模块的使用

############################################################################

进阶用法


可以使用多个位置参数:

[python] view plain copy
  1. import argparse  
  2.   
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("x", type=int, help="the base")  
  5. parser.add_argument("y", type=int, help="the exponent")  
  6. parser.add_argument("-v""--verbosity", action="count", default=0)  
  7. args = parser.parse_args()  
  8. answer = args.x**args.y  
  9. if args.verbosity >= 2:  
  10.     print "{} to the power {} equals {}".format(args.x, args.y, answer)  
  11. elif args.verbosity >= 1:  
  12.     print "{}^{} == {}".format(args.x, args.y, answer)  
  13. else:  
  14.     print answer  

python Argparse模块的使用


可以使用可选参数来显示不同级别的信息:

[python] view plain copy
  1. parser = argparse.ArgumentParser()  
  2. parser.add_argument("x", type=int, help="the base")  
  3. parser.add_argument("y", type=int, help="the exponent")  
  4. parser.add_argument("-v""--verbosity", action="count", default=0)  
  5. args = parser.parse_args()  
  6. answer = args.x**args.y  
  7. if args.verbosity >= 2:  
  8.     print "Running '{}'".format(__file__)  
  9. if args.verbosity >= 1:  
  10.     print "{}^{} == ".format(args.x, args.y)  
  11. print answer  

python Argparse模块的使用

##################################################

以下是DIGITS中的一段源码:

[python] view plain copy
  1. if __name__ == '__main__':  
  2.     script_start_time = time.time()  
  3.   
  4.     parser = argparse.ArgumentParser(description='Classification example - DIGITS')  
  5.   
  6.     ### Positional arguments  
  7.   
  8.     parser.add_argument('caffemodel',   help='Path to a .caffemodel')  
  9.     parser.add_argument('deploy_file',  help='Path to the deploy file')  
  10.     parser.add_argument('image',        help='Path to an image')  
  11.   
  12.     ### Optional arguments  
  13.   
  14.     parser.add_argument('-m''--mean',  
  15.             help='Path to a mean file (*.npy)')  
  16.     parser.add_argument('-l''--labels',  
  17.             help='Path to a labels file')  
  18.     parser.add_argument('--nogpu',  
  19.             action='store_true',  
  20.             help="Don't use the GPU")  
  21.   
  22.     args = vars(parser.parse_args())  
  23.   
  24.     image_files = [args['image']]  
  25.   
  26.     classify(args['caffemodel'], args['deploy_file'], image_files,  
  27.             args['mean'], args['labels'], not args['nogpu'])  
  28.   
  29.     print 'Script took %s seconds.' % (time.time() - script_start_time,)