在命令行下启动某个程序时,总会遇到要求输入参数的情况。参数的格式一般
都是一下三总格式之一:
针对以上3种格式,script.py脚本需要正确解析后,才能知道到底要如何进行对应的操作。
其中,格式3中的等号可以换成空格。
格式1中,各个参数都是没有名称的。脚本启动后,按照参数所在的位置来确定参数值的意义。如:
第一个参数表示ip
第二个参数表示端口
必须提前定义好,脚本内也必须按照这个定义解析出相应的值。如果解析颠倒了,这程序必然乱套。
这种传递启动参数的方法不够灵活,但是胜在简单易用。
import sys
print(type(sys.argv))
print('script name: ', sys.argv[0])
argv_cnt = len(sys.argv)
for i in range(1, argv_cnt, 1):
print('argv[', i, ']', sys.argv[i])
sys.argv的类型为:
sys.argv的第一个元素是脚本文件的名称,其他元素为用户传入的参数。
注意:如果某个参数中间含有空格,需要用""包围起来,否则会识别出多个参数。
运行如下图:
格式2中,各个参数都是由 (-name value)的形式提供参数的,其中name必须是一个字符,如-h, -p 或 -P等,区分大小写。在这里我们可以把这种形式称之为短可选参数。
这种参数模式,获取到的参数内容不是按照参数所在位置决定的,而是按照参数的短名称决定的。
import sys, getopt
opts, _ = getopt.getopt(sys.argv[1:], "h:vw:t:n:")
print(opts)
for name, value in opts:
if name == '-v':
print('version 1')
elif name == '-h':
print('-h do something with value: ', value)
elif name == '-w':
print('-w do something with value: ', value)
elif name == '-t':
print('-t do something with value: ', value)
elif name == '-n':
print('-n do something with value: ', value)
'''
h:vw:t:n:
表示解析的参数里必须包括 -h -w -t -n -v, 其他选项会抛出异常,如-a -b
冒号表示短名称需要提供值。如 -h hello
v后面没有冒号,表示这个短名称不需要提供值。
注意:不提供值,不代表这个参数没有意义。如 -v表示显示版本.
'''
从源码可以看到,sys.argv[1:]以后的所有参数,都被传入到getopt.getopt中,转换到了opts列表中。
运行截图:
注意:
在getopt.getopt中,v后面没有冒号。如果非要给-v后面加一个值,如-v 123会怎么样呢?
答案是:不行。
如下图所示, -v后面的其他参数都没有解析出来,都被弄丢了。
格式3中,各个参数都是以(–name=value 或 --name value)的形式提供参数。其中name可以是一个单词,中间不能有空格。
import argparse
parser = argparse.ArgumentParser(description='')
parser.add_argument('--hello', type=str, default='')
parser.add_argument('--world', type=str, default='')
parser.add_argument('--total', type=str, default='')
parser.add_argument('--number', type=int, default='0')
parser.add_argument('--version', action="store_true")
args = parser.parse_args()
if args.hello != '':
print('--hello do something with value: ', args.hello)
if args.world != '':
print('--world do something with value: ', args.world)
if args.total != '':
print('--total do something with value: ', args.total)
if args.number != '':
print('--number do something with value: ', args.number)
if args.version == True:
print('version 1')
从源码可以看到,解析长选项参数共分3步:
解析结果存储在args变量中。
注意:如果传入的参数没有添加到parser对象中,则解析会失败。
注意:如果要解析的参数是个无值参数(学名叫flag参数), 则添加参数名称时需要指定action的值。
如:parser.add_argument(‘–version’, action=“store_true”)
store_true表示:传入–version参数时,args.version为真,不传入时,args.version为假。
如果解析成功,那么可以通过 args.参数名称获取参数的值。如果参数值为默认值,可以断定这个可选参数没有被设置。