argparse模块用法简要总结

argparse简要用法总结

argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广。
argparse使用比较简单,常用的功能可能较快地实现出来,下面我分几个步骤,以Python3为例,简要讲述argparse的用法。

1.基本框架

下面是使用argparse从命令行获取用户名,然后打印’Hello ‘+ 用户名,假设python文件名为test.py

# file-name:test.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(description="Demo of argparse")
    parser.add_argument('--name', default='World')
    
    return parser

if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    name = args.name
    print('Hello {}'.format(name))

在命令行执行如下命令:

$ python test.py --name Zhou
Hello Zhou

上面的代码段中,我们显示引入了argparse包,然后通过argparse.ArgumentParser函数生成argparse对象,其中这个函数的description函数表示在命令行显示帮助信息的时候,这个程序的描述信息。之后我们通过对象的add_argument函数来增加参数。这里我们只增加了一个–name的参数,然后后面的default参数表示如果没提供参数,我们默认采用的值。即如果像下面这样执行命令:

$ python test.py 

则输出是:

$ Hello World 

最后我们通过argpaser对象的parser_args函数来获取所有参数args,然后通过args.name的方式得到我们设置的–name参数的值,可以看到这里argparse默认的参数名就是–name形式里面–后面的字符串。整个流程就是这样,下面我们详细讲解add_argument函数的一些最常用的参数,使得你看完这个教程之后,能完成科研和工作中的大部分命令解析任务。

2. default:没有设置值情况下的默认参数

如同上例中展示的,default表示命令行没有设置该参数的时候,程序中用什么值来代替。

3. required: 表示这个参数是否一定需要设置

如果设置了required=True,则在实际运行的时候不设置该参数将报错:

...
parser.add_argument('-name', required=True)
...

则运行下面的命令会报错:

$ python test.py
usage: test.py [-h] --name NAME
print_name.py: error: argument --name is required
4. type:参数类型

默认的参数类型是str类型,如果你的程序需要一个整数或者布尔型参数,你需要设置type=int或type=bool,下面是一个打印平方的例子:

#name: square.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(
        description='Calculate square of a given number')
    parser.add_argument('-number', type=int)

    return parser

if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    res = args.number ** 2
    print('square of {} is {}'.format(args.number, res))

执行:

$ python square.py -number 5
square of 5 is 25
5. choices:参数值只能从几个选项里面选择

如下面的代码:

# filename: choices.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(
        description='choices demo')
    parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg'])

    return parser

if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    print('the arch of CNN is '.format(args.arch))

如果像下面这样执行会报错:

$ python choices.py -arch resnet
usage: choices.py [-h] -arch {alexnet,vgg}
choices.py: error: argument -arch: invalid choice: 'resnet' (choose from 'alexnet', 'vgg')
6. help:指定参数的说明信息

在现实帮助信息的时候,help参数的值可以给使用工具的人提供该参数是用来设置什么的说明,对于大型的项目,help参数和很有必要的,不然使用者不太明白每个参数的含义,增大了使用难度。
下面是个例子:

# file-name: help.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(
        description='help demo')
    parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg'],
        help='the architecture of CNN, at this time we only support alexnet and vgg.')

    return parser


if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    print('the arch of CNN is '.format(args.arch))

在命令行加-h或–help参数运行该命令,获取帮助信息的时候,结果如下:

$ python help.py -h
usage: help.py [-h] -arch {alexnet,vgg}

choices demo

optional arguments:
  -h, --help           show this help message and exit
  -arch {alexnet,vgg}  the architecture of CNN, at this time we only support
                       alexnet and vgg.
7. dest:设置参数在代码中的变量名

argparse默认的变量名是–或-后面的字符串,但是你也可以通过dest=xxx来设置参数的变量名,然后在代码中用args.xxx来获取参数的值。

8. nargs: 设置参数在使用可以提供的个数

使用方式如下:

parser.add_argument('-name', nargs=x)

其中x的候选值和含义如下:

值 含义
x 参

含义
x参数的绝对个数(例如:5)
‘?’0或者1个参数
‘*’0或所有参数
‘+’所有,并且至少一个参数

如下例子:

# file-name: nargs.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(
        description='nargs demo')
    parser.add_argument('-name', required=True, nargs='+')
    
    return parser


if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    names = ', '.join(args.name)
    print('Hello to {}'.format(names))

执行命令和结果如下:

$ python nargs.py -name A B C
Hello to A, B, C
9. action=‘store_true’

上一个用法中-v必须指定参数值,否则就会报错,有没有像-h那样,不需要指定参数值的呢,答案是有,通过定义参数时指定action="store_true"即可,用法如下

#!/usr/bin/env python
# encoding: utf-8
#filename:test.py

import argparse


parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
print(args.verbose)
if args.verbose:
        print("verbosity turned on")

在命令行输入:

$ python test.py

输出:

False

在命令行输入:

$ python test.py -v

输出:

True
verbosity turned on

说明action 就像是一个开关,控制参数v的输入。

10. 程序用法帮助

介绍了为每个参数定义帮助文档,那么给整个程序定义帮助文档该怎么进行呢?
通过argparse.ArgumentParser(description=“calculate X to the power of Y”)即可
修改test.py内容如下:

#!/usr/bin/env python
# encoding: utf-8
#filename:test.py

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", "--question", 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))

在命令输入:

$ python test.py -h
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --question
11. 互斥参数

在上个例子中介绍了互斥的参数

group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--question", action="store_true")

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

 $ python test.py 4 2      
4^2 == 16
 $ python test.py  4 2 -v
4 to the power 2 equals 16
 $ python test.py  4 2 -q
16
 $ python test.py  4 2 -q -v
 usage: test.py [-h] [-v | -q] x y
 test.py: error: argument -v/--verbose: not allowed with argument -q/--question

可以看出,-q和-v不出现,或仅出现一个都可以,同时出现就会报错,可定义多个互斥组。

参考链接:
https://www.jianshu.com/p/fef2d215b91d.
http://vra.github.io/2017/12/02/argparse-usage/.

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值