import argparse:首先导入模块

parser = argparse.ArgumentParser(description="your script description"):创建一个解析对象,description 参数可以用于插入描述脚本用途的信息,可以为空

parser.add_argument():向该对象中添加你要关注的命令行参数和选项

parser.parse_args():进行解析

在多个文件或者不同语言协同的项目中,python 脚本经常需要从命令行直接读取参数。下面我们通过几个例子来学习 argparse。

我们先创建一个脚本 prog.py,然后输入如下内容:

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

下面我们在 shell 中进行测试:


1

第 1 个没有任何输出和出错

第 2、3 个测试为打印帮助信息,argparse 会自动生成帮助文档,-h 为短写

第 4 个测试为未定义的 -v 参数,会出错

第 5 个测试为未定义的参数 df,出错

我们可以看出:prog.py 仅仅只有可选参数 -help 与其短写 -h,为了传入更加复杂的参数,下面我们需要借用 parser.add_argument()。

1 位置参数

positional arguments

用法是不用带 -,改写 prog.py 为

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("e")
args = parser.parse_args()
print(args.e)

测试结果:


2

定义了一个叫 e 的参数,默认必选,分析:

第 1 个测试为不带参数,由于 e 参数为空,所以报错,并给出用法(usage)和错误信息

第 2 个测试为打印帮助信息

第 3 个测试为正常用法,回显了输入字符串 Hi

2 可选参数

optional arguments,有两种方式:

- 指定的短参数,如 -h

-- 指定的长参数,如 --help

这两种方式可以同存,也可以只存在一个,修改 prog.py 内容如下:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", help="添加输出 verbosity")
args = parser.parse_args()
if args.verbosity:
print("打开 verbosity")

测试结果:


3

通过图 3 我们很容易便明白可选参数的用法,但是 -v 必须指定参数值,否则就会报错,有没有像 -h 那样,不需要指定参数值的呢,答案是有,通过定义参数时指定action="store_true" 即可,用法如下:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="增加输出 verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("打开 verbosity")

测试结果:


4

-v 没有指定任何参数也可,其实存的是 True 和 False,如果出现,则其值为True,否则为 False:


5

3 类型 type

默认的参数类型为 str,如果要进行数学计算,需要在参数进行解析后进行类型转换,如果不能转换则会报错:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('x', type=int, help="输入数字")
args = parser.parse_args()
y = args.x
answer = y ** 3 + y + 1
print(answer)

测试与结果:


6

4 可选值 choices=[]

2 中的 action 的例子中定义了默认值为 True 和 False 的方式,如果要限定某个值的取值范围,比如 3 中的整型,限定其取值范围为 0, 1, 2:

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)

测试结果:


7

5 程序用法帮助

argparse.ArgumentParser(description="calculate X to the power of Y")
import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^{} == {}".format(args.x, args.y, answer))

打印帮助信息时即显示 calculate X to the power of Y:


8

6 互斥参数

上个例子中定义了互斥参数:
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")

第 1 行定义了一个互斥组,第 2, 3 行在互斥组中添加了 -v 和 -q 两个参数,用上个例子中的程序进行如下测试:


9

可以看出,-q 和 -v 不出现,或仅出现一个都可以,同时出现就会报错。

7 参数默认值

import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
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],
default=1,
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)

测试结果如下:


10