argparse模块作为optparse的一个替代被添加到Python2.7。argparse的实现支持一些不易于添加到optparse以及要求向后不兼容API变化的特性,因此以一个新模块添加到标准库。argparse的API类似于optparse,甚至在很多情况下通过更新所使用的类名和方法名,使用argparse作为一个简单的替代。然而,有些地方在添加新特性时不能保持直接兼容性。
一、设置解析器
使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数。那么当你的程序运行时,该解析器就可以用于处理命令行参数。解析器类是ArgumentParser。构造方法接收几个参数来设置用于程序帮助文本的描述信息以及其他全局的行为或设置。
1 2 |
>>> import argparse >>> parser = argparse.ArgumentParser(description='This is a PyMOTW sample program') |
经过配置argparse会自动添加选项用来生成帮助信息以及为你的应用程序显示版本信息。ArgumentParser的参数add_help控制帮助信息相关的选项,默认为True;version参数控制版本信息,默认为1.0。
1 |
parser = argparse.ArgumentParser(add_help=True,version='1.0') |
二、定义参数与动作
argparse是一个全面的参数处理库。参数可以触发不同的动作,动作由add_argument()方法的action参数指定。支持的动作包括保存参数(逐个地,或者作为列表的一部分),当解析到某参数时保存一个常量值(包括对布尔开关真/假值的特殊处理),统计某个参数出现的次数,以及调用一个回调函数。
默认的动作是保存参数值。在这种情况下,如果提供一个类型,那么在存储之前会先把该参数值转换成该类型。如果提供dest参数,参数值就保存为命令行参数解析时返回的命名空间对象中名为该dest参数值的一个属性。
argparse参数的动作,其内置6种action,可以在解析到一个参数时进行触发:
store
:保存参数值,可能会先将参数值转换成另一个数据类型。若没有显式指定动作,则默认为该动作。
store_const
:保存一个被定义为参数规格一部分的值,而不是一个来自参数解析而来的值。这通常用于实现非布尔值的命令行标记。
store_ture/store_false
:保存相应的布尔值,这两个动作被用于实现布尔开关。
append
:将值保存到一个列表中,若参数重复出现,则保存多个值。
append_const
:将一个定义在参数规格中的值保存到一个列表中。
version
:打印关于程序的版本信息,然后退出。
三、解析命令行
定义了所有参数之后,你就可以给parse_args()传递一组参数字符串来解析命令行。默认情况下,参数是从sys.argv[1:]中获取,但你也可以传递自己的参数列表。选项是使用GNU/POSIX语法来处理的,所以在序列中选项和参数值可以混合。
parse_args()的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性,因此如果你的参数dest是”myoption”,那么你就可以args.myoption来访问该值。一般做选项判断的时候需要使用。
下面来简单使用一下argparse模块,以下简单示例带有3个不同的选项:一个布尔选项(-a),一个简单的字符串选项(-b),以及一个整数选项(-c)。
1 2 3 4 5 6 7 8 9 10 |
# 设置一个解析器; import argparse parser = argparse.ArgumentParser(description='Short sample app') # 定义参数; parser.add_argument('-a', action="store_true", default=False) parser.add_argument('-b', action="store", dest="b") parser.add_argument('-c', action="store", dest="c", type=int) print(parser.parse_args(['-a', '-bval', '-c', '3'])) |
有几种方式传递值给单字符选项,以上例子使用了两种不同的形式,-bval
和-c val
。
1 2 |
$ python argparse_short.py Namespace(a=True, b='val', c=3) |
在输出中与’c’关联的值是一个整数,因为程序告诉ArgumentParser在保存之前先转换该参数。
“长”选项名字,即选项的名字多于一个字符,以相同的方式进行处理。
1 2 3 4 5 6 7 8 9 |
import argparse parser = argparse.ArgumentParser(description='Example with long option names') parser.add_argument('--noarg', action="store_true", default=False) parser.add_argument('--witharg', action="store", dest="witharg") parser.add_argument('--withargs', action="store", dest="witharg2", type=int) print(parser.parse_args(['--noarg', '--witharg', 'val', '--withargs=3'])) |
结果也类似:
1 2 |
$ python argparse_long.py Namespace(noarg=True, witharg='val', witharg2=3) |
当然,长短选项也是可以合用的,且一般都是这么使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import argparse parser = argparse.ArgumentParser() parser.add_argument("-u", "--user", dest="user", action="store", help="username for login mysql") parser.add_argument("-p", "--password", dest="password", action="store", help="Password to use when connecting to server") parser.add_argument("-H", "--host", dest="host", action="store", help="Host for connecting mysql") parser.add_argument("-P", "--port", dest="port", action="store", help="Port for connecting mysql") print(parser.parse_args()) |
对于argparse模块区别于optparse模块的一个地方是对非选项参数值的处理,optparse只进行选项解析,而argparse是一个全面的命令行参数解析工具,也处理非选项参数。
1 2 3 4 5 6 7 |
import argparse parser = argparse.ArgumentParser(description='Example with non-optional arguments') parser.add_argument('count', action="store", type=int) parser.add_argument('units', action="store") print(parser.parse_args()) |
在这个例子中,”count”参数是一个整数,”units”参数存储为一个字符串。其中任意一个参数若没有在命令行中提供,或给定的值不能被转换为正确的类型,就会报告一个错误。
1 2 3 4 5 6 7 8 9 10 |
$ python argparse_arguments.py 3 inches Namespace(count=3, units='inches') $ python argparse_arguments.py some inches usage: argparse_arguments.py [-h] count units argparse_arguments.py: error: argument count: invalid int value: 'some' $ python argparse_arguments.py usage: argparse_arguments.py [-h] count units argparse_arguments.py: error: too few arguments |
测试argparse内置的所有动作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import argparse parser = argparse.ArgumentParser() parser.add_argument('-s', action='store', dest='simple_value', help='Store a simple value') parser.add_argument('-c', action='store_const', dest='constant_value', const='value-to-store', help='Store a constant value') parser.add_argument('-t', action='store_true', default=False, dest='boolean_switch', help='Set a switch to true') parser.add_argument('-f', action='store_false', default=False, dest='boolean_switch', help='Set a switch to false') parser.add_argument('-a', action='append', dest='collection', default=[], help='Add repeated values to a list') parser.add_argument('-A', action='append_const', dest='const_collection', const='value-1-to-append', default=[], help='Add different values to list') parser.add_argument('-B', action='append_const', dest='const_collection', const='value-2-to-append', help='Add different values to list') parser.add_argument('-v', '--version', action='version', version='%(prog)s V1.0') results = parser.parse_args() print('simple_value = %s') % results.simple_value print('constant_value = %s') % results.constant_value print('boolean_switch = %s') % results.boolean_switch print('collection = %s') % results.collection print('const_collection = %s') % results.const_collection |
下面来看看不同action的使用方式跟输出。
argparse支持打出帮助选项,帮助选项(-h
和--help
)默认是添加的,但可以通过将add_help设置为false来禁用。如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ python argparse_action.py -h usage: 1.py [-h] [-s SIMPLE_VALUE] [-c] [-t] [-f] [-a COLLECTION] [-A] [-B] [--version] optional arguments: -h, --help show this help message and exit -s SIMPLE_VALUE Store a simple value -c Store a constant value -t Set a switch to true -f Set a switch to false -a COLLECTION Add repeated values to a list -A Add different values to list -B Add different values to list --version show program's version number and exit |
如果想禁用,如下:
1 |
parser = argparse.ArgumentParser(add_help=False) |
store
1 2 3 4 5 6 |
$ python argparse_action.py -s test simple_value = test constant_value = None boolean_switch = False collection = [] const_collection = [] |
store_const
1 2 3 4 5 6 |
$ python argparse_action.py -c simple_value = None constant_value = value-to-store boolean_switch = False collection = [] const_collection = [] |
store_true
1 2 3 4 5 6 |
$ python argparse_action.py -t simple_value = None constant_value = None boolean_switch = True collection = [] const_collection = [] |
store_false
1 2 3 4 5 6 |
$ python argparse_action.py -f simple_value = None constant_value = None boolean_switch = False collection = [] const_collection = [] |
append
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ python argparse_action.py -a a -a b -a c simple_value = None constant_value = None boolean_switch = False collection = ['a','b','c'] const_collection = [] $ python argparse_action.py -a a,b,c simple_value = None constant_value = None boolean_switch = False collection = ['a,b,c'] const_collection = [] |
append_const
1 2 3 4 5 6 |
$ python argparse_action.py -B -A simple_value = None constant_value = None boolean_switch = False collection = [] const_collection = ['value-1-to-append', 'value-2-to-append'] |
version
1 2 |
$ python argparse_action.py --version argparse_action.py V1.0 |
四、选项判断
上面说了,parse_args()的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性,因此如果你的参数dest是”myoption”,那么你就可以args.myoption来访问该值。一般做选项判断的时候需要使用。
1 2 3 4 |
results = parser.parse_args() if results.simple_value is None: print(please input a string value for simple_value) sys.exit() |
借助这个可以使你的程序更加健壮,防止意外情况发生。
<参考>
http://www.cnblogs.com/lovemyspring/p/3214598.html