Python命令行参数解析:getopt和argparse

一 Python的参数传递

在Python中命令行参数通过sys.argv传递,它的类型是一个list类型,其中的元素为字符串。

# -*-coding:GBK-*-
# !python.exe
# 这是一个测试sys.argv的脚本


import sys


if __name__ == '__main__':
    print u"命令行参数为:"
    print sys.argv

例1-1 打印传入的脚本参数

如不输入任何参数执行脚本,那么它仅有一个元素为脚本的全路径,结果如下:

命令行参数为:
['E:/py/Jenkins-KaiJia/test_args.py']

输入参数为-a param_a --b="param_b with space" -c时,输出的结果为:

命令行参数为:

['E:/py/Jenkins-KaiJia/test_args.py', '-a', 'param_a', '--b=param_b with space', '-c']


二 通过getopt解析Python传入的参数

当我们需要获取例1-1中需要的-a参数指定的值param_a,-b参数指定的"param_b with space"时,可以使用python自带的getopt模块获取。它能解析带'-'和'--'格式的参数。它的函数原型为:

getopt.getopt(argsoptions[long_options])

其中第一个参数args为需要解析的命令行参数列表。一般为sys.argv[1:],这是因为argv[0]为脚本的路径。第二个参数options为希望识别的参数,如果该命令行参数需要指定一个参数值,如例1-1中的-a param_a,那么它必须跟一个冒号":",即"a:",再加上例1-1中不需要指定参数值的c即为:"a:c"或者"ca:"。

使用长格式的命令行参数,例如"--b=param_b"时,需要在参数3中指定它。参数3是一个list指定了那些需要识别的长格式的参数。在例1-1中--b参数需要在getopt的参数3中指定。格式为["b="](注意它是一个列表),如果有多个,假设还有参数--d=x,--e=y,--f=z需要解析那么需要在列表中一一指定,如:["b=","d=","e="]。

返回值包含两个值,第一个值即已识别的-a --b -c这些参数及其值的键值对(option,value)。

示例如下:

# -*-coding:utf-8 -*-
# !python.exe
# 这是一个测试getopt.getopt的脚本


import sys,getopt


if __name__ == "__main__":
    try:
        opts, args = getopt.getopt(sys.argv[1:],"a:cd:",["b="])
        for opt, arg in opts:
            if "-a" == opt:
                print u'a参数已经指定,值为:' + arg
            elif "--b" == opt:
                print u'b参数已经指定,值为' + arg
            elif '-c' == opt:
                print u'c参数已经指定,值为:' + arg
            elif '-d' == opt:
                print u'd参数已经指定,值为:' + arg
    except getopt.GetoptError ,e:
        print u'参数解析发生了错误:' + e.msg
        sys.exit(1)

例2-1 使用getopt.getopt解析命令行参数

当输入为-a param_a --b="param_b with space" -c -d dx时,结果为:

a参数已经指定,值为:param_a
b参数已经指定,值为param_b with space
c参数已经指定,值为:
d参数已经指定,值为:dx


三 使用argparse解析命令行参数

argparse是一个可以自动生成使用帮助的python模块。

# -*-coding:utf-8 -*-
# !python.exe
# 这是一个测试argparse的脚本


import argparse


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="show example")
    parser.add_argument("-a", "--param_a", help="help of param_a")
    parser.add_argument("-b", "--param_b", help="help of param_b", action="store_true")
    exptypegroup = parser.add_mutually_exclusive_group()
    exptypegroup.add_argument("-r", "--remote", help="remote mode", action="store_true")
    exptypegroup.add_argument("-l", "--local", help="local mode", action="store_true")
    ARGS = parser.parse_args()
    if ARGS.param_a:
        print u"设置了param_a值为:" + ARGS.param_a
    if ARGS.param_b:
        print u"设置了param_b值为:" + str(ARGS.param_b)

例3-1 使用argparse解析命令行参数

parser = argparse.ArgumentParser(description="show example")
这一行是argparse的构造函数,当其中description参数指定了当用户敲入-h时显示的模块介绍。
 
  
parser.add_argument("-a", "--param_a", help="help of param_a")
这个函数用于添加可解析的参数,其中action=store_true的意义是如果使用了这个参数则值默认为TRUE。
 
  
exptypegroup = parser.add_mutually_exclusive_group()
这个函数添加一组互斥的选项,如上例中的-l和-r只能用一个。

argparse自带-h参数解析,在使用命令行参数-h运行上例脚本时,展示如下:


usage: test_argparse [-h] [-a PARAM_A] [-b] [-r | -l]


show example


optional arguments:
  -h, --help            show this help message and exit
  -a PARAM_A, --param_a PARAM_A
                        help of param_a
  -b, --param_b         help of param_b
  -r, --remote          remote mode
  -l, --local           local mode


当使用-a avalue -b -l时结果如下:

设置了param_a值为:avalue
设置了param_b值为:True
设置了本地模式


当使用-a avalue -b -r -l时的结果:

usage: test_argparse [-h] [-a PARAM_A] [-b] [-r | -l]
test_argparse: error: argument -l/--local: not allowed with argument -r/--remote
这是因为-l和-r设置了互斥模式只能选择其一。


你可能感兴趣的:(python)