某些情况下需要在命令行环境下(window的cmd或者Linux的Terminal)完成Python脚本与命令行的交互,这种情况下就需要Python能够解析命令行参数。这种需求可以类比Linux下的各种Linux命令,比如:ls/cp src dst等等。
以下代码实践均在window环境下进行,而且前提是已经安装Python环境。如果不了解这方面,建议先阅读下面的参考教程再阅读本部分。
首先看下面的代码:
import argparse
parser=argparse.ArgumentParser(description="计算两个数字乘积")
parser.add_argument("-a","--a",help="其中一个因子a",type=int)
parser.add_argument("-b","--b",help="其中一个因子b",type=int)
args=parser.parse_args()
print(args.a,args.b)
print(args.a*args.b)
将上面的代码保存成Test0627_1.py,并在cmd环境下将目录调到test.py所在的目录,运行下面的命令
python Test0627_1.py -h
可以看到help的信息如下:
上述代码中首先import这个命令行解析模块,然后调用argparse.ArgumentParser()类生成一个对象parse,其中的description描述这个参数解析器是干什么的,当我们在命令行显示帮助信息的时候会看到description描述的信息。这是常规的定义parse的方法。
下面两行是利用add_argument()方法增加两个参数,一个参数是–a,一个是–b,为了方便,我们简写为-a,-b。其中的-作为通过命令行传入的可选参数(optional arguments)都是必须要有的,不能省略。后面我们会看到固定参数或者位置参数(positional arguments),这种参数可以省略-,而且是必须输入的,即使有默认值都不行的那种。
add_argument中的help是显示这个参数的作用,这个可以显示在整个help中,type=int的意思是接受的数据类型必须是int类型参数。
args=parser.parse_args()
可以认为是parser对象的实例化。实例化后的args拥有a,b两个参数,这也就解释了后面两行。
如果想输入参数,我们可以按照格式直接传入参数。
这肯定没有什么问题,但是如果我们不传入任何参数,程序就会直接默认传入的类型和int类型不符,如下
为了保证没有参数传入也是对的,我们可以加一个默认值,代码修改为:
import argparse
parser=argparse.ArgumentParser(description="计算两个数字乘积")
parser.add_argument("-a","--a",help="其中一个因子a",type=int,default=2)
parser.add_argument("-b","--b",help="其中一个因子b",type=int,default=4)
args=parser.parse_args()
print(args.a,args.b)
print(args.a*args.b)
此时再键入命令行,如果没有参数传入,将会使用默认值。如果有参传入,会使用新参。如下:
上述例子可以接受任意的int型输入,但是对于很多情况下,False和True更为有用,请看下面的代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
相比于之前的代码多了
action="store_true"
这句代码的意思是默认args.verbose是False。当action=“store_false”,就默认args.verbose是True。这部分的理解可以参照博客:
action=‘store_true’
所以会有下面的测试输出:
$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosity
值得注意的是带有action=“store”或者action="false"时,合法的输入只有
python3 prog.py --verbose
或者
python3 prog.py
前者的后面不能带有传入数字。这就解释了第二个测试为什么是不对的。
相对于optional argument可选而且可以指定默认值,positional argument是用于在命令行下必须输入的参数,否则将会报错。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
type=int)
args = parser.parse_args()
print(args.square**2)
对应的测试如下:
$ python3 prog.py 4
16
$ python3 prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'
$python3 prog.py
usage: prog.py [-h] square
prog.py: error: the following arguments are required: square
上面的第一个是正确的,第二个输入的不是int类型,第三个没有输入,故报错。
该部分可以参考Argparse Tutorial,只是上面Positional and Optional arguments的结合,实用性更强。