python脚本启动参数设置与解析

格式设置

在命令行下启动某个程序时,总会遇到要求输入参数的情况。参数的格式一般
都是一下三总格式之一:

  1. python script.py hello world “hello world” 1
  2. python script.py -h hello -w world -t “hello world” -n 1
  3. python script.py --hello=hello --world=world --total=“hello world” --number=1

针对以上3种格式,script.py脚本需要正确解析后,才能知道到底要如何进行对应的操作。
其中,格式3中的等号可以换成空格

格式1(位置参数)解析

格式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的类型为:, 所以脚本可以通过len来确定argv中参数的个数。
sys.argv的第一个元素是脚本文件的名称,其他元素为用户传入的参数。
注意:如果某个参数中间含有空格,需要用""包围起来,否则会识别出多个参数。
运行如下图:
python脚本启动参数设置与解析_第1张图片

格式2(短可选参数)解析

格式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(长可选参数)解析

格式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步:

  1. 先构造一个ArgumentParser对象,
  2. 然后调用add_argument在对象中添参数选项
  3. 最后调用parse_args解析参数。

解析结果存储在args变量中。

注意:如果传入的参数没有添加到parser对象中,则解析会失败。
注意:如果要解析的参数是个无值参数(学名叫flag参数), 则添加参数名称时需要指定action的值。
如:parser.add_argument(‘–version’, action=“store_true”)
store_true表示:传入–version参数时,args.version为真,不传入时,args.version为假。

使用解析出的参数

如果解析成功,那么可以通过 args.参数名称获取参数的值。如果参数值为默认值,可以断定这个可选参数没有被设置。

截图(传入–version)

在这里插入图片描述

截图(不传入–version)

在这里插入图片描述

你可能感兴趣的:(Python笔记,python,开发语言)