argparse
argparse模块可以用来方便地处理命令行参数。
基本使用示例
创建一个
ArgumentParse
对象,ArgumentParser
对象可以将命令行参数转变为Python数据。>>> parser = argparse.ArgumentParser(description='Process some integers.')
添加参数
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+', ... help='an integer for the accumulator') >>> parser.add_argument('--sum', dest='accumulate', action='store_const', ... const=sum, default=max, ... help='sum the integers (default: find the max)')
解析参数。
parse_args()
会扫描命令行,将命令行参数转换为Python数据并激活相应action。通常,这会建立一个namespace
对象。>>> parser.parse_args(['--sum', '7', '-1', '42']) Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
使用详解
ArgumentParser对象
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)
常用参数
prog
:定义在帮助信息中显示的程序名,默认使用sys.argv[0]
。无论是使用自定义的程序名还是sys.argv[0]
,在帮助信息都可以使用%(prog)s
引用。>>> parser = argparse.ArgumentParser(prog='myprogram') >>> parser.add_argument('--foo', help='foo of the %(prog)s program') >>> parser.print_help() usage: myprogram [-h] [--foo FOO] optional arguments: -h, --help show this help message and exit --foo FOO foo of the myprogram program
description
和epilog
:description
用于定义程序的简短描述,epilog
定义程序的其他额外信息。prefix_chars
:用于自定义命令行参数前缀。默认为'-',可以使用-h/--help
这种参数形式。可以改变为其他字符或者增加其他字符,比如prefix_chars='-*+'
。fromfile_prefix_chars
:定义文件起始符,这些字符后的参数会被当做文件。>>> with open('args.txt', 'w') as fp: ... fp.write('-f\nbar') >>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@') >>> parser.add_argument('-f') >>> parser.parse_args(['-f', 'foo', '@args.txt']) Namespace(f='bar')
其他参数
usage
:用于自定义usage信息的显示格式。parents
:接受一个由ArgumentParser对象组成的列表,列表中每个ArgumentParser的参数都会被添加到当前ArgumentParser对象。formatter_class
:用于自定义帮助信息显示格式。allow_abbrev
:允许参数简写。conflict_handler
:解决参数冲突(不同action有相同的选项字符串)。add_help
:设置为false时,不会自动添加-h/--help
选项。
add_argument()方法
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
常用参数
name or flags
:add_argument()可以添加optional参数或positional参数,传递给add_argument()的第一个参数必须是一系列flags(optional argument)或者一个name(optional argument)。注意,添加positional参数后命令行必须输入该参数,否则会报错。optional参数会通过前缀识别,剩余的都被认为是positional参数。>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('-f', '--foo') >>> parser.add_argument('bar') >>> parser.parse_args(['BAR']) Namespace(bar='BAR', foo=None) >>> parser.parse_args(['--foo', 'FOO', 'BAR']) Namespace(bar='BAR', foo='FOO') >>> parser.parse_args(['--foo', 'FOO']) usage: PROG [-h] [-f FOO] bar PROG: error: too few arguments
action
:定义怎样处理命令行参数。常用的actions有:store
:store
是默认值,只会存储命令行参数的值。store_const
存储由const指定的参数值。store_const
、store_true
和store_false
:用于指定命令行参数的缺省值。store_const
缺省值由const关键字指定,后两者指定布尔值。>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_const', const=42) >>> parser.add_argument('--bar', action='store_false') >>> parser.add_argument('--baz', action='store_false') >>> parser.parse_args('--foo --bar'.split()) Namespace(foo=42, bar=False, baz=True)
注意最后一行的输出,baz确实是True。这三种store只是指定了当命令行出现了相应选项而没有指定参数值时应采用的缺省值,而不是命令行参数的默认值。
append
:存储一个列表,将每个参数值追加到列表中。这将允许对一个选项进行多次赋值。>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2'])
append_const
:存储一个列表,并将const关键字参数指定的值添加到列表中。这将允许多个选项将值存到同一个列表中。>>> parser = argparse.ArgumentParser() >>> 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'>])
version
:用于显示版本信息。>>> import argparse >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--version', action='version', version='%(prog)s 2.0') >>> parser.parse_args(['--version']) PROG 2.0
其他action:count、help以及自定义的action。
nargs
:通常,ArgumentParser对象会将一个命令行参数与一个单独的action关联,nargs允许将多个命令行参数关联到一个动作。支持的取值有:N(an integer)
:N个命令行参数值会被收集到一个列表>>> parser = argparse.ArgumentParser() >>> 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 = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='?', const='c', default='d') >>> parser.add_argument('bar', nargs='?', default='d') >>> parser.parse_args(['XX', '--foo', 'YY']) Namespace(bar='XX', foo='YY') >>> parser.parse_args(['XX', '--foo']) Namespace(bar='XX', foo='c') >>> parser.parse_args([]) Namespace(bar='d', foo='d')
这通常被用于输入输出:
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin) >>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), default=sys.stdout) >>> parser.parse_args(['input.txt', 'output.txt']) Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>) >>> parser.parse_args([]) Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)
其他取值:
'*'
、'+'
、'argparse.REMAINDER'
。
type
:通常,命令行参数会被读为字符串,type允许进行类型检查和转换。>>> parser = argparse.ArgumentParser() >>> parser.add_argument('foo', type=int) >>> parser.add_argument('bar', type=open) >>> parser.parse_args('2 temp.txt'.split()) Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2)
还可以用来处理文件读写。argparse模块提供了FileType factory。可以接受open()函数的参数,比如mode=、bufsize=、encoding=以及errors=。
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('bar', type=argparse.FileType('w')) >>> parser.parse_args(['out.txt']) Namespace(bar=<_io.TextIOWrapper name='out.txt' encoding='UTF-8'>)
choices
:限定命令行参数的在一定范围内取值。>>> parser = argparse.ArgumentParser(prog='game.py') >>> 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} game.py: error: argument move: invalid choice: 'fire' (choose from 'rock', 'paper', 'scissors')
dest
:通常,ArgumentParser的actions会将命令行参数的值转化为parse_args()返回对象的属性值。对于positional参数,属性名由第一个参数决定。对于optional参数,属性名由第一个长参数去掉'--'后进行一些其他处理产生;如果没有长参数,则由第一个短参数去掉'-'后产生。>>> parser = argparse.ArgumentParser() >>> parser.add_argument('bar') >>> parser.parse_args(['XXX']) Namespace(bar='XXX') >>> parser = argparse.ArgumentParser() >>> parser.add_argument('-f', '--foo-bar', '--foo') >>> parser.add_argument('-x', '-y') >>> parser.parse_args('-f 1 -x 2'.split()) Namespace(foo_bar='1', x='2') >>> parser.parse_args('--foo 1 -y 2'.split()) Namespace(foo_bar='1', x='2')
dest关键字参数可以为属性指定其他名称。
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', dest='bar') >>> parser.parse_args('--foo XXX'.split()) Namespace(bar='XXX')
metavar
:当ArgumentParser产生帮助信息时,需要引用命令行参数。默认情况下,对positional参数,会直接使用dest值;对optional参数,会使用dest的大写值。metavar参数允许指定为其他值。注意,这只改变命令行选项在帮助信息中的显示名,不改变对象中的属性名。>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', metavar='YYY') >>> parser.add_argument('bar', metavar='XXX') >>> parser.parse_args('X --foo Y'.split()) Namespace(bar='X', foo='Y') >>> parser.print_help() usage: [-h] [--foo YYY] XXX positional arguments: XXX optional arguments: -h, --help show this help message and exit --foo YYY
其他参数
const
:用法见前文。default
:设置默认值。required
:可以使optional参数成为必选参数。help
:选项的简短介绍,显示在帮助信息中。
parse_args()方法
ArgumentParser.parse_args(args=None, namespace=None)
args参数接受以下形式:
选项与值分开:
>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('-x') >>> parser.add_argument('--foo') >>> parser.parse_args(['-x', 'X']) Namespace(foo=None, x='X') >>> parser.parse_args(['--foo', 'FOO']) Namespace(foo='FOO', x=None)
对于长参数(选项名不止一个字符),可以由=连接选项和值:
>>> parser.parse_args(['--foo=FOO']) Namespace(foo='FOO', x=None)
对于短选项,可以将选项和值连在一起:
>>> parser.parse_args(['-xX']) Namespace(foo=None, x='X')
当多个短选项中只有最后一个需要参数值的话,可以合并在一起:
>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('-x', action='store_true') >>> parser.add_argument('-y', action='store_true') >>> parser.add_argument('-z') >>> parser.parse_args(['-xyzZ']) Namespace(x=True, y=True, z='Z')
Namespace对象
parse_args()返回的namespace对象只是一个简单的对象(object的子类)。也可以将属性值添加到一个已经存在的其他对象上:
>>> class C: ... pass ... >>> c = C() >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> parser.parse_args(args=['--foo', 'BAR'], namespace=c) >>> c.foo 'BAR'