前言
在命令行运行过程序的同学应该对命令的附加参数不陌生,比如我们在
windows
下的命令窗口中输入
help rename
,则它的显示如下:
其输出说明了
rename
这个命令的用法,如果你仔细观察就会发现,它后面带的参数不止一个,而是好几个,甚至还有以
[]
括起来的可选参数,那么这种方式如果用
Python
怎么来实现呢?
这一篇文章中,我们就来介绍
Python
中一个强大的输入参数解析库,利用它,我们很容易完成命令行与
Python
脚本之间的参数传递。
argparse
库
在
Python
中,有不少的本地库,这些库都是随着
Python
安装时同步安装的,其中就有一个库叫
argparse
,顾名思议,这是一个允许我们对命令行参数进行解析的库。
利用这个库,我们可以对必须的参数或可选的参数做出规定,同时也可以确定命令行参数的数据类型和设定相关的帮助文档,下面我们来详细进行说明。
参数的脚本编写流程
首先当然是导入
argparse
库,然后创建一个
ArgumentParser()
对象:
import argparseparse = argparse.ArgumentParser()
接着我们来添加要输入的变量,然后完成解析,再将输入的变量乘以
2
打印出来:
parse.add_argument("number")args = parse.parse_args()print(args.number * 2)
将这段代码保存为
ex1.py
,来运行一下看是什么样子。
当我们在命令行中输入
python ex1.py
不带参数时,看看会发生什么:
λ python ex1.pyusage: ex1.py [-h] numberex1.py: error: the following arguments are required: number
程序报错,提示需要带一个名叫
number
的参数。
我们将其添加上再来运行一下,看看怎样:
λ python ex1.py 555
结果出来了,好消息是程序没有报错,可是输出的结果却并非我们想要的,因为我们最开始的目标是将输入的数乘以2输出,即输入5,要输出10才对,可是却输出了
55
,这是怎么回事呢?
原来是因为在程序中,我们并没有为输入的参数指定数据类型,这样默认情形下就将其当作字符串接收了,因此,在乘以2时,执行的是字符串的乘法命令。
为了达到我们的目的,需要在程序中为输入参数指定数据类型,修改程序如下:
import argparseparse = argparse.ArgumentParser()parse.add_argument("number", type=int)args = parse.parse_args()print(args.number * 2)
然后再来执行一下:
λ python ex1.py 510
这一次就执行成功能了,对比两次程序,我们发现只有一行代码发生了改变,就是在
ArgumentParser
解析器中添加参数时加入
type=int
即可,这样就自动将输入的参数转化为
int
类型,当然如果输入的是无法转换成整数的字符串,同样会报错,比如:
λ python ex1.py hellousage: ex1.py [-h] numberex1.py: error: argument number: invalid int value: 'hello'
为脚本增加可选参数
上面的程序中,我们可以接受一个数字作为参数,那么增加一个可选参数时该如何处理呢?假若我们想有这样一个功能,当输入两个数作为参数时,程序来打印两数之积,如果只有一个数字输入时,就输出这个数字的2倍,这样的功能应该如何实现?下面我们来进一步修正代码:
import argparseparse = argparse.ArgumentParser()parse.add_argument("num1", type=int)parse.add_argument("--num2", type=int, dest="num2")args = parse.parse_args()if args.num2: print(args.num1 * args.num2)else: print(args.num1 * 2)
我们注意到,在增加
num2
时,参数提示符前加了
--
字样,这指的是该参数为可选参数,同时在其后附加了一个
dest
参数,它的功能是将输入的参数转换为程序内部的变量名称,而
--num2
则是外部调用时却要指定的字符样式,它的调用是这样的:
λ python ex1.py 10 --num2 330
如果只带一个参数时,调用与原来的没有区别:
λ python ex1.py 1020
当输入变量出错时,命令窗口会提示出错,同时会将该脚本的用法打印出来:
λ ex1.py 10 3usage: ex1.py [-h] [--num2 NUM2] num1ex1.py: error: unrecognized arguments: 3
熟悉命令窗口参数的同学一下子就会看到熟悉的
[]
可选参数框。
一些小技巧
到目前为止,我们已经知道了如何利用
argparse
来实现命令行窗口参数解析的方法,但是还有一些小技巧需要注意一下:
1、可选参数为开关变量
有时候我们所编写的脚本程序中,可选参数只是一个开关变量,即当附带该可选参数时,程序输出是一个结果,不带该参数时,输出另一个结果,这个时候当然也可以用上述的方式通过给出可选参数某一个值来判定,比如输入一个字符串,可选参数的功能是大小写转换,这时用上述我们介绍的方法可以这样来实现:
import argparseparse = argparse.ArgumentParser()parse.add_argument('greeting')parse.add_argument("--caps", dest="caps")args = parse.parse_args()if args.caps: print(args.greeting.upper())else: print(args.greeting)
这样的程序调用时,只要给
--caps
后面附带任何字符,都可以将输入的字符串转换成大写:
λ python ex1.py hello --caps 1HELLO
但这样看起来不优雅,其实在
argparse
库中,在附加可选参数时,可以用一行
action="store_true"
代码来标记该参数为开关变量,这样上述代码就可改写如下:
import argparseparse = argparse.ArgumentParser()parse.add_argument('greeting')parse.add_argument("--caps", action="store_true")args = parse.parse_args()if args.caps: print(args.greeting.upper())else: print(args.greeting)
注意观察上述代码,实际上只有一行进行了修正,这样一来,在命令行调用时,就可以显得很简洁,如:
λ python ex1.py hello --capsHELLO
脚本包含帮助文档
我们所编写的脚本肯定是要实现特定功能的,为了更好给别人使用或时间久了以免自己忘记,最好增加一些帮助文档,来说明该脚本的功能及使用方法,这样在命令窗口调用该脚本时,只要在其后加上
--help
,即可输出其文档信息,比如:
import argparseparse = argparse.ArgumentParser()parse.add_argument('greeting', help="这段文本可以被打印")parse.add_argument("--caps", help="该标志可以将小写字母转换成大写", action="store_true")args = parse.parse_args()if args.caps: print(args.greeting.upper())else: print(args.greeting)
添加了
help
参数后,在命令行的调用如下:
λ python ex1.py --helpusage: ex1.py [-h] [--caps] greetingpositional arguments:greeting 这段文本可以被打印optional arguments:-h, --help show this help message and exit--caps 该标志可以将小写字母转换成大写
这样的帮助信息可以让我们对该脚本的功能一目了然。
为参数设置一个短提示
在上述可转换字符串大写的脚本中,参数
--caps
显得有些长,如果这样的可选参数比较多,一行命令写下来就显得很啰嗦,为了解决这个问题,可以用较短的字母,比如用
--c
来表示
--caps
,这样写起来会显得简洁,此时只需要将可选参数的一行代码修正如下:
parse.add_argument("-c", "--caps", help="该标志可以将小写字母转换成大写", action="store_true")
帮助文档及调用如下:
λ python ex1.py --helpusage: ex1.py [-h] [-c] greetingpositional arguments:greeting 这段文本可以被打印optional arguments:-h, --help show this help message and exit-c, --caps 该标志可以将小写字母转换成大写---------------------------------------λ python ex1.py hello -cHELLO
小结
本文对
Python
中的
argparse
库进行了介绍,编写脚本程序是帮助我们进行工作学习自动化的必备技能,希望同学们能熟悉掌握这个解析参数的标准库。