一 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
(args, options[, 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设置了互斥模式只能选择其一。