官方document
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
定义应该如何解析一个命令行参数。下面每个参数有它们自己详细的描述,简单地讲它们是:
name or flags - 选项字符串的名字或者列表,例如foo 或者-f, --foo。 action - 在命令行遇到该参数时采取的基本动作类型。 nargs - 应该读取的命令行参数数目。 const - 某些action和nargs选项要求的常数值。 default - 如果命令行中没有出现该参数时的默认值。 type - 命令行参数应该被转换成的类型。 choices - 参数可允许的值的一个容器。 required - 该命令行选项是否可以省略(只针对可选参数)。 help - 参数的简短描述。 metavar - 参数在帮助信息中的名字。 dest - 给parse_args()返回的对象要添加的属性名称。
# 位置参数 import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int,help="display a square of a given number") args = parser.parse_args() print(args.square**2)
#输出 >python ArgparseDemo.py 123 15129
# 可选参数 parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbosity", help="increase output verbosity",action="store_false") args = parser.parse_args() if args.verbosity: print('verbosity turned on') # 当有action关键词且值为store_true时,如果命令行指定了这个可选参数,args.verbosity就赋值为True,否则就为False.多指定了值就会发生错误。
#输出: >python ArgparseDemo.py --verbosity verbosity turned on >python ArgparseDemo.py 12 usage: ArgparseDemo.py [-h] [--verbosity] ArgparseDemo.py: error: unrecognized arguments: 12
简写:
#简写 parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbosity", help="increase output verbosity",action="store_true") args = parser.parse_args() if args.verbosity: print('verbosity turned on') #输出 >python ArgparseDemo.py -v verbosity turned on
#混合使用定位(位置)和可选参数 parser = argparse.ArgumentParser() parser.add_argument("square", help="display a square of a given number",type=int) parser.add_argument("-v", "--verbosity", help="increase output verbosity",action="store_true") args = parser.parse_args() answer = args.square**2 if args.verbosity: print('the square of {} equals {}'.format(args.square, answer)) else: print(answer) #输出 >python ArgparseDemo.py 4 -v the square of 4 equals 16 >python ArgparseDemo.py 4 16
# 来看看为程序加上处理重复参数的能力会怎么样: parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbosity", type=int, 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) >python ArgparseDemo.py 4 16 >python ArgparseDemo.py 4 -v 1 4^2 == 16 >python ArgparseDemo.py 4 -v 2 the square of 4 equals 16 >python ArgparseDemo.py 4 -v 3 16 #出现了bug
# 我们可以通过限制--verbosity后面跟的值来修正: import argparse parser = argparse.ArgumentParser() 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], 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) #输出 >python ArgparseDemo.py 4 -v 3 usage: ArgparseDemo.py [-h] [-v {0,1,2}] square ArgparseDemo.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
'''现在让我们用一种更常用的方法来处理,类似CPython处理自己的参数(参考python --help):''' import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display the square of a given number") parser.add_argument("-v", "--verbosity", action="count", 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) >python ArgparseDemo.py 4 16 >python ArgparseDemo.py 4 -v 4^2 == 16 >python ArgparseDemo.py 4 -vv the square of 4 equals 16 >python ArgparseDemo.py 4 --verbosity --verbosity the square of 4 equals 16 >python ArgparseDemo.py 4 -vvv 16 #最后那个输出又暴露了程序的bug >python ArgparseDemo.py 4 -h usage: ArgparseDemo.py [-h] [-v] square positional arguments: square display the square of a given number optional arguments: -h, --help show this help message and exit -v, --verbosity increase output verbosity '''但是不爽的是,帮助信息并没有做出有用的提示,不过可以通过修改help来改善这个问题。'''
import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display the square of a given number") parser.add_argument("-v", "--verbosity", action="count", 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) #输出 >python ArgparseDemo.py 4 -vvvv the square of 4 equals 16 >python ArgparseDemo.py 4 -v 4^2 == 16 >python ArgparseDemo.py 4 Traceback (most recent call last): File "ArgparseDemo.py", line 180, in <module> if args.verbosity >= 2: TypeError: '>=' not supported between instances of 'NoneType' and 'int' ''' 第一个输出是正确的,修正了上个版本的问题,参数出现次数>=2时都能显示详细的信息。 第三个输出还是有问题 '''
#再来修改下: import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display the square of a given number") parser.add_argument("-v", "--verbosity", action="count",default=0, 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) #输出 >python ArgparseDemo.py 4 16