python学习交流Python

python argparse 用法总结

2018-12-16  本文已影响2人  水之心

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

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

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

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

1

我们可以看出: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 的参数,默认必选,分析:

2 可选参数

optional arguments,有两种方式:

这两种方式可以同存,也可以只存在一个,修改 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 没有指定任何参数也可,其实存的是 TrueFalse,如果出现,则其值为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 的例子中定义了默认值为 TrueFalse 的方式,如果要限定某个值的取值范围,比如 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
上一篇 下一篇

猜你喜欢

热点阅读