Python是一门很是好用的脚本语言,天然使用它来开发命令行程序也比较方便。并且Python的标准库中有一个名为argparse的库,能够很是方便的让咱们把命令行参数转换成所需的数据格式。下面就让咱们来看看如何使用argparse标准库吧。html
若是想详细了解argparse的话,能够查看Python官方文档,目前已经出了中文版文档,极大的方便了咱们中国开发者,虽然有些地方没有完整翻译,可是已经彻底够用了。python
首先来看看argparse的基本用法,下面是最简单的一个例子。能够看到argparse标准库其实用起来很简单,分红三个步骤:正则表达式
ArgumentParser
对象add_argument
方法添加参数parse_args
方法接受并解析对象下面咱们就依次来看看这些步骤吧。数组
import argparse parser = argparse.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')
ArgumentParser
是最重要的一个类,咱们要使用argparse标准库就必然须要建立这个类的实例。若是有须要的话,能够经过在构造函数中设置各类参数的方式来修改ArgumentParser
类的行为。因为参数项比较多,因此官方文档建议咱们使用关键字参数的方式来添加参数。app
sys.argv[0]
),默认是Python程序的文件名ArgumentParser
对象的列表,它们的参数也应包含在内。假如多个parser有一些能够共享的参数,能够经过设置子parser的方式来共享None
)None
),假如须要给全部参数指定一个相通的默认值,能够修改这个,若是但愿全局禁用默认值,可使用argparse.SUPRESS
-h/--help
选项(默认值: True
)True
)有了Parser实例,就能够调用它的add_argument
方法来添加程序能够接受的参数了。这个参数比较复杂,功能也十分强大。函数
foo
或 -f, --foo
。parse_args()
所返回对象上的属性名。方法的第一个参数是参数名称,能够是一个字符串(name)或者是-
开头的一组字符串(flags),前者是位置参数,会按照添加的顺序被读取;后者是关键字参数,能够以任意顺序指定。若是指定的是关键字参数(flags),能够同时添加缩写和完整名,它们分别须要用-
和--
来作前缀。学习
import argparse parser = argparse.ArgumentParser() parser.add_argument('foo') parser.add_argument('bar') parser.add_argument('-f', '--ff', action='store_true') args = parser.parse_args('FOO BAR -f'.split(' ')) print(args) args = parser.parse_args('--ff BAR FOO'.split(' ')) print(args) '''运行结果,注意指定的参数和获取到的结果的不一样 Namespace(bar='BAR', ff=True, foo='FOO') Namespace(bar='FOO', ff=True, foo='BAR') '''
接下来介绍的参数都是关键字参数,能够按需制定。这里比较重要的一个是action,它指定了读取参数接下来要作什么。这部分能够看官方文档,介绍的比较全面,并且有对应的例子。我这里只简单介绍一下。测试
-f
的时候开启某个功能,忽略这个参数的时候不执行,就能够把它的行为指定成store_true,而后在程序中就能够获得f名字的参数真值,而后简单的条件判断就能够了。-v
会显示简单输出,-vv
会显示复杂输出。甚至若是需求更复杂的话,还能够本身实现一个新的Action类,而后添加给add_argument
方法。ui
这个参数指定你的程序能够接受的参数个数,可使用如下几个值:this
?
,和正则表达式里的概念差很少,后面的一个值会被读取,若是没有的话会从default读入。+
,后面的多个值会被读取,若是没有会抛出异常。?
,后面的多个值会被读取,没有值的话也能够。argparse.REMAINDER
,它会将后面全部值读取为一个参数,一般用做向其余命令行传递参数用。默认状况下nargs会按照action的类型来判断参数个数,store和store_const会读取后面的一个值做为参数。
这个参数须要和带有const的action来配合使用。
指定参数的默认值。这里有一个颇有趣的点,若是你看官方文档比较仔细的话,可能会产生一个和我同样的疑问: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) '''
这个是指定参数类型的,int、float、str那些。固然比较特殊的一个是open,它会将参数做为文件来打开。
若是默认的open还不能知足,还可使用argparse.FileType
,它提供了读写模式、文件编码、缓冲区大小等详细设置。
parser.add_argument('bar', type=argparse.FileType('w'))
甚至有需求的话,这里还可使用咱们本身的函数,只要它的参数是一个字符串,返回值是转换之后的值就能够。
若是确认参数范围限定是几个定值,可使用choices参数来指定,可接受的值包括字面值列表以及range
函数。
指定参数是不是必须的。
metavar参数用来指定参数的显示名称,而dest用来指定参数底层使用的属性名。
注意下面的程序输出,foo参数只修改了metavar,因此在帮助信息输出中发生了变化,可是在Namespace底层仍然使用foo保存值。而bar参数修改了dest,因此底层属性名发生了变化,可是在帮助信息中并无什么改变。
import argparse parser = argparse.ArgumentParser() 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) '''
有条件的话最好给每一个参数添加帮助信息,这样使用者在用-h
命令的时候就能够看到参数的帮助信息了。
编辑好了参数,就能够调用parse_args
方法来处理参数了,它会返回一个命名空间对象,包含了解析以后的参数。若是要测试方法的话,能够手动给它传递一组参数,不然的话,它会自动从命令行参数读取。另外它还支持几个比较有用的特性:
-foo=bar
。import argparse 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) '''
另外还支持默认无歧义的参数缩写。
import argparse parser = argparse.ArgumentParser() parser.add_argument('-f1aaaaaaaaaa') parser.add_argument('-f2aaaaaaaaaa') print(parser.parse_args('-f1 a -f2 b'.split(' ')))
前面也看到了,解析完参数返回的值是命名空间对象,它用起来很是简单,直接访问属性值就能够了。
import argparse parser = argparse.ArgumentParser() parser.add_argument('-a') parser.add_argument('-b') args = parser.parse_args('-a a -b b'.split(' ')) print(args.a) # a
argparse还支持一些其余特性,这里就很少作介绍了,详情请直接参考官方文档。
parse_argument
在遇到未知参数的时候会报错,若是须要保存这些参数传递给其余命令行的时候,可使用parse_known_args
方法。它不会由于未知参数报错, 并且会将全部不认识的参数存储成一个列表做为第二个返回值。扯了大半天,你们可能仍是有点不会用argparse,不过其实只要看一个简单的例子就能够了。保存下面的文件,而后用命令行调用,看看不一样的参数会有什么输出。
import argparse parser = argparse.ArgumentParser(prog='ParserSample', description='简单实例程序,学习如何解析命令行参数', epilog='很简单就能够学会') parser.add_argument('greeting', type=str, help='问候信息,必需') parser.add_argument('-fromm', default='yitian', type=str, help='发送人,默认是易天') parser.add_argument('-to', default='everyone', type=str, nargs='*', help='接收人,默认是全部人') parser.add_argument('-p', action='store_true', help='是否添加感叹号') args = parser.parse_args() output = f'{args.fromm} say {args.greeting} to {args.to}' if args.p: output = output + '!' print(output) ''' usage: ParserSample [-h] [-fromm FROMM] [-to [TO [TO ...]]] [-p] greeting 简单实例程序,学习如何解析命令行参数 positional arguments: greeting 问候信息,必需 optional arguments: -h, --help show this help message and exit -fromm FROMM 发送人,默认是易天 -to [TO [TO ...]] 接收人,默认是全部人 -p 是否添加感叹号 很简单就能够学会 '''