argparse 是 Python 内置的处理命令行参数的库。
这篇文章是抄袭官网提供的 tutorial 来的,如果你不想看英文或者喜欢更口水化的表达,请看我这篇。否则更推荐官网的教程。
开始 1 2 3 4 import argparseparser = argparse.ArgumentParser() parser.parse_args()
这是最基本的用法。什么都不用做我们就有了一个 -h
选项。
1 2 3 4 5 6 7 $ python demo.py $ python demo.py -h usage: demo.py [-h] optional arguments: -h, --help show this help message and exit
位置参数 1 2 3 4 5 6 import argparseparser = argparse.ArgumentParser() parser.add_argument("echo" ) args = parser.parse_args() print(args.echo)
add_argument
帮我们搞定了一个位置参数。留意 “echo” 这个字符串的前面是没有 “-“ 横杆的,这表示他是一个位置参数。带横杆的是可选参数,下一节就会提到。
1 2 3 4 5 6 7 8 9 10 11 $ python demo.py -h usage: demo.py [-h] echo positional arguments: echo optional arguments: -h, --help show this help message and exit $ python demo.py hello hello
看到了么?把 “hello” 作为 echo
参数传了进来, print(args.echo)
就把他打印出来了。
帮助信息 如果你想让人知道 echo
参数是干嘛的,在 help
参数里面说一下就好:
1 2 3 parser.add_argument("echo" , help="echo the string you use here" )
1 2 3 4 5 6 7 8 $ python demo.py -h usage: demo.py [-h] echo positional arguments: echo echo the string you use here optional arguments: -h, --help show this help message and exit
看到上面输出的 echo
参数的用途了么?
做点事情 上面写的 echo
函数显然没什么卵用,我们来写一段有点实际用途的。
1 2 3 4 5 6 7 import argparseparser = argparse.ArgumentParser() parser.add_argument("square" , help="display a square of a given number" ) args = parser.parse_args() print(args.square ** 2 )
你看我们写了一段程序来算一个数的平方。
1 2 3 4 5 $ python demo.py 4 Traceback (most recent call last): File "demo.py" , line 7 , in <module> print (args.square ** 2 ) TypeError: unsupported operand type (s) for ** or pow(): 'str' and 'int'
额,出错了!因为 argparse
太笨了不知道 square
参数是个 int
来着。不过这很正常,命令行传进来的参数全部是字符串。当然这种场景 argparse
是可以 hold 住的。加个 type=int
看看:
1 2 3 4 parser.add_argument("square" , help="display a square of a given number" , type=int)
再试一次:
It works.
可选参数 介绍完位置参数,来看看可选参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 import argparseparser = argparse.ArgumentParser() parser.add_argument("square" , type=int, help="display a square of a given number" ) parser.add_argument("--verbosity" , help="increase output verbosity" ) args = parser.parse_args() if args.verbosity: print('{} ^^ 2 == {}' .format(args.square, args.square ** 2 )) else : print(args.square ** 2 )
可选参数,就是你传不传都可以:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ python demo.py 4 16 $ python demo.py 4 --verbosity 1 4 ^^ 2 == 16 $ python demo.py --help usage: demo.py [-h] [--verbosity VERBOSITY] square positional arguments: square display a square of a given number optional arguments: -h, --help show this help message and exit --verbosity VERBOSITY increase output verbosity $ python demo.py 4 --verbosity usage: demo.py [-h] [--verbosity VERBOSITY] square demo.py: error: argument --verbosity: expected one argument
如果你给参数 --verbosity
带了值,那代码中的 args.verbosity
的值就是你传入的值,比如上面例子中的 1
。如果你不传这个参数,那 args.verbosity
的值会是 None
。但是看最后一个例子,你带了 --verbosity
却不给他一个值,居然报错了?
存在即 True 改一下代码可以解决我们上面的问题。
1 2 3 parser.add_argument("--verbosity" , help="increase output verbosity" , action="store_true" )
我们加了一个 action="store_true"
参数,表示出现 --verbosity
时, args.verbosity
即为 True。
1 2 3 4 5 $ python demo.py 4 --verbosity 4 ^^ 2 == 16 $ python demo.py 4 16
短参数 --verbosity
太 TM 长了,这样下去要键盘手了,赶紧来个短参数爽一爽:
1 2 3 parser.add_argument("-v" , "--verbosity" , help="increase output verbosity" , action="store_true" )
效果:
1 2 $ python demo.py 4 -v 4 ^^ 2 == 16
Nice!
休息时间! 给我们的程序加上友好的输出信息吧!让 -v
支持多个值作为选项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import argparseparser = 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(args.square ** 2 )
效果:
1 2 3 4 5 6 7 8 9 10 11 $ python demo.py 4 -v 0 16 $ python demo.py 4 -v 1 4 ^^ 2 == 16 $ python demo.py 4 -v 2 the square of 4 equals 16 $ python demo.py 4 -v 3 16
看,我们支持了不同的 -v
值时显示不同的内容。可是 -v
为 3 时的结果不尽如意…
参数可选值 传 3 进来并没有什么卵用,不给传 3 就好了:
1 2 3 4 parser.add_argument("-v" , "--verbosity" , type=int, choices=[0 , 1 , 2 ], help="increase output verbosity" )
效果:
1 2 3 $ python demo.py 4 -v 3 usage: demo.py [-h] [-v {0 ,1 ,2 }] square demo.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0 , 1 , 2 )
结语 到这里我们的 5 分钟教程就结束了。
上面讲的东西应该足够满足简单的命令行程序的需求,如果你需要更高级的用法,请查询 Python 标准库文档。
文档:[Python2 ] [Python3 ]