文章目录
前言
学习记录,有问题请指正,谢谢。
一、argparse模块是什么?
argparse是python的命令行解析的标准模块,内置于python,不需要安装。这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行。
二、使用步骤
1.基本用法
import argparse #导入argparse
parser = argparse.ArgumentParser()# 创建ArgumentParser类
parser.add_argument('-from', type=str)# 添加参数
parser.add_argument('-to', type=str, default='everyone')# 添加参数
args = parser.parse_args('-from yitian'.split(' '))
print(args)
# 运行结果
# Namespace(from='yitian', to='everyone')
2.ArgumentParser类
ArgumentParser是参数规范的容器,并且具有将解析器作为整体应用的选项。参数如下:
3.add_argument方法
有了Parser实例,就可以调用它的add_argument方法来添加程序可以接受的参数了。这个参数比较复杂,功能也十分强大。参数如下:
参数名
一共三种表达方式
- 参数名(按照添加顺序被读取)
- -参数名(关键字参数,可以以任意顺序指定)
- - -参数名缩写(关键字参数的缩写)
例子
parser.add_argument('foo')
parser.add_argument('bar')
parser.add_argument('-f', '--ff', action='store_true')
action
- store和store_const用来保存具体的值
#'store' parser.add_argument('--foo') parser.parse_args('--foo 1'.split()) #Namespace(foo='1')
# 'store_const' parser.add_argument('--foo', action='store_const', const=42) parser.parse_args(['--foo']) #Namespace(foo=42)
- store_true和store_false用来设置开关
parser.add_argument('--foo', action='store_true') parser.add_argument('--bar', action='store_false') parser.add_argument('--baz', action='store_false') parser.parse_args('--foo --bar'.split()) #Namespace(foo=True, bar=False, baz=True)
- append和append_const会将参数存储成一个列表
parser.add_argument('--foo', action='append') parser.parse_args('--foo 1 --foo 2'.split()) #Namespace(foo=['1', '2'])
parser.add_argument('--str', dest='types', action='append_const', const=str) parser.add_argument('--int', dest='types', action='append_const', const=int) parser.parse_args('--str --int'.split()) Namespace(types=[<class 'str'>, <class 'int'>])
- count会存储参数出现的次数。
parser.add_argument('--verbose', '-v', action='count', default=0) parser.parse_args(['-vvv']) # Namespace(verbose=3)
提示:default 将为 None,除非显式地设为 0。
nargs
-
N(命令行中的 N 个参数会被聚集到一个列表中)
parser.add_argument('--foo', nargs=2) parser.add_argument('bar', nargs=1) parser.parse_args('c --foo a b'.split()) Namespace(bar=['c'], foo=['a', 'b'])
-
‘*’,所有当前命令行参数被聚集到一个列表中。
parser.add_argument('--foo', nargs='*') parser.add_argument('--bar', nargs='*') parser.add_argument('baz', nargs='*') parser.parse_args('a b --foo x y --bar 1 2'.split()) # Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
-
‘+’ 和 ‘*’ 类似,所有当前命令行参数被聚集到一个列表中。
parser.add_argument('foo', nargs='+') parser.parse_args(['a', 'b']) # Namespace(foo=['a', 'b']) parser.parse_args([]) # usage: PROG [-h] foo [foo ...] # PROG: error: the following arguments are required: foo
如果不提供 nargs 命名参数,则消耗参数的数目将被 action 决定。通常这意味着单一项目(非列表)消耗单一命令行参数。
const
- 这个参数需要和带有const的action来配合使用。
default
- 指定参数的默认值。
- store_const和const配合使用可以指定默认值,而store和default也可以指定默认值,那么它们之间有什么区别呢?
import argparse parser = argparse.ArgumentParser() parser.add_argument('-foo', action='store', nargs='?', default=10, const=20) print(parser.parse_args('-foo 0'.split(' '))) print(parser.parse_args('-foo'.split(' '))) print(parser.parse_args('')) ''' Namespace(foo='0') Namespace(foo=20) Namespace(foo=10) '''
type
- 指定参数类型,int,float,str,当然比较特殊的一个是open,它会将参数作为文件来打开。
parser.add_argument('bar', type=argparse.FileType('w'))
choices
- 使用choices参数来指定可使用值,可使用值值包括字面值列表以及range函数。
parser.add_argument('move', choices=['rock', 'paper', 'scissors']) parser.parse_args(['rock']) # Namespace(move='rock') parser.parse_args(['fire']) # usage: game.py [-h] {rock,paper,scissors}
parser.add_argument('door', type=int, choices=range(1, 4)) print(parser.parse_args(['3'])) #Namespace(door=3) parser.parse_args(['4']) #usage: doors.py [-h] {1,2,3}
required
- 指定参数是否是必须的。
parser.add_argument('--foo', required=True) parser.parse_args(['--foo', 'BAR']) #Namespace(foo='BAR') parser.parse_args([]) #usage: [-h] --foo FOO
metavar和dest
-
metavar参数用来指定参数的显示名称,而dest用来指定参数底层使用的属性名。
parser.add_argument('-foo', metavar='foooo') parser.add_argument('-bar', dest='barrrr') parser.print_help() print(parser.parse_args('')) ''' usage: argparse_sample.py [-h] [-foo foooo] [-bar bar] optional arguments: -h, --help show this help message and exit -foo foooo -bar bar Namespace(barrrr=None, foo=None) '''
help
- 有条件的话最好给每个参数添加帮助信息,这样使用者在用-h命令的时候就可以看到参数的帮助信息了。
parser.add_argument('--foo', action='store_true', help='foo the bars before frobbling') parser.add_argument('bar', nargs='+', help='one of the bars to be frobbled') parser.parse_args(['-h']) usage: frobble [-h] [--foo] bar [bar ...] positional arguments: bar one of the bars to be frobbled options: -h, --help show this help message and exit --foo foo the bars before frobbling
4.parse_args方法
编辑好了参数,就可以调用parse_args方法来处理参数了,它会返回一个命名空间对象,包含了解析之后的参数。如果要测试方法的话,可以手动给它传递一组参数,否则的话,它会自动从命令行参数读取。另外它还支持几个比较有用的特性:
-
如果参数比较长,可以使用等号来连接参数与值,例如-foo=bar。
-
如果参数是单字母长度的,可以将参数和值直接写在一起。
parser = argparse.ArgumentParser() parser.add_argument('-foo') parser.add_argument('-b') print(parser.parse_args('-foo=bar'.split())) print(parser.parse_args('-bX'.split())) ''' Namespace(b=None, foo='bar') Namespace(b='X', foo=None) '''
其他特性
- 参考官网
add_mutually_exclusive_group()方法
- 创建一个互斥组。 argparse 将会确保互斥组中只有一个参数在命令行中可用:
group = parser.add_mutually_exclusive_group() group.add_argument('--foo', action='store_true') group.add_argument('--bar', action='store_false') parser.parse_args(['--foo']) #Namespace(bar=True, foo=True) parser.parse_args(['--bar']) #Namespace(bar=False, foo=False) parser.parse_args(['--foo', '--bar']) #usage: PROG [-h] [--foo | --bar] #PROG: error: argument --bar: not allowed with argument --f
参考
https://segmentfault.com/a/1190000021680525
https://docs.python.org/zh-cn/3/library/argparse.html#nargs