-
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 个没有任何输出和出错
- 第 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)
测试结果:
定义了一个叫 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 我们很容易便明白可选参数的用法,但是 -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")
测试结果:
-v
没有指定任何参数也可,其实存的是 True
和 False
,如果出现,则其值为True
,否则为 False
:
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)
测试与结果:
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)
测试结果:
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
:
6 互斥参数
上个例子中定义了互斥参数:
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
第 4 行定义了一个互斥组,第 5, 6 行在互斥组中添加了 -v
和 -q
两个参数,用上个例子中的程序进行如下测试:
可以看出,-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)
测试结果如下: