zoukankan      html  css  js  c++  java
  • python 命令行参数sys.grgv和getopt模块

    在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能。

    目前有短选项和长选项两种格式。短选项格式为"-"加上单个字母选项;长选项为"--"加上一个单词。

    命令行参数分为选项(opts)和参数(args)

    sys.argv获得命令行参数

    import sys

    print(sys.argv)

    运行程序

    D:projects uncmd>python test.py -a -b args1 --cc --dd=args2 file1

    ['test.py', '-a', '-b', 'args1', '--cc', '--dd=args2', 'file1']

    可见,所有命令行参数以空格为分隔符,都保存在了sys.argv列表中。其中第1个为脚本的文件名。

    选项的写法要求

    短格式

    "-"号后面要紧跟一个选项字母。

    如果还有此选项的附加参数,可以用空格分开,也可以不分开。长度任意,可以用引号。

    -o         #只有选项,没有参数,用作功能开关

    -oa        #选项加参数,没有空格

    -obbbb        #选项加参数,没有空格

    -o bbbb        #选项加参数,有空格

    -o "a b"        #选项加参数,参数有空格需要加引号

    长格式

    "--"号后面要跟一个单词。

    如果还有此选项的附加参数,后面要紧跟"=",再加上参数。"="号前后不能有空格。

    --help=file1

    getopt分析命令行参数

     

    由sys.argv获得命令行参数以后,使用getopt模块进行分析

    语法

    getopt(args, shortopts, longopts=[])

    第一个参数args为要分析的参数列表,一般设置为sys.argv[1:]

    第二个参数为短格式选项

    • 当只有选项,没有参数时,即-h 样式,在分析串中写入该字符,h或者-h
    • 当选项有参数时,即-f file1样式,在分析串中写入该字符加冒号,f:或者-f:

    第三个参数为长格式选项

    当只有选项,没有参数时,即--help样式,在分析串中写入该参数。help

    当选项有参数时,即--file=file1时,在分析串中吸入该参数加等号。file=

    返回值

    opts, args两个列表

    opts为分析出的格式信息。opts是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数则为空字符串。

    args为不属于格式信息的剩余的命令行参数,即不是按照getopt()里面定义的长或短选项字符和附加参数以外的信息。

    示例1:getopt分析脚本参数

    代码:

    import sys,getopt

    print(sys.argv)

    opts, args = getopt.getopt(sys.argv[1:], '-a-b:', ['cc', 'dd='])

    print('opts',opts)

    print('args',args)

     

    运行:

    D:projects uncmd>python test.py -a -b args1 --cc --dd=args2 file1

    ['test.py', '-a', '-b', 'args1', '--cc', '--dd=args2', 'file1']

    opts [('-a', ''), ('-b', 'args1'), ('--cc', ''), ('--dd', 'args2')]

    args ['file1']

    示例2:getopt进一步分析脚本参数,进行下一步处理

    代码:

    import sys,getopt
    print(sys.argv)
    opts, args = getopt.getopt(sys.argv[1:], 'hi:', ['help', 'ip='])
    print('opts',opts)
    print('args',args)
    for opt_name,opt_value in opts:
    if opt_name in ['-h','--help']:
    print('help doc')
    sys.exit()
    if opt_name in ['-i','--ip']:
    print(opt_value)
    sys.exit()

     

    运行:

    D:projects uncmd>python test.py -h

    ['test.py', '-h']

    opts [('-h', '')]

    args []

    help doc

     

    D:projects uncmd>python test.py -i 192.168.1.1

    ['test.py', '-i', '192.168.1.1']

    opts [('-i', '192.168.1.1')]

    args []

    192.168.1.1

    示例3:各种用法

    直接运行脚本,不加选项和参数,显示帮助信息

    if len(sys.argv[1:]) == 0:
    print(helpdoc)
    sys.exit()

    运行脚本,加-h或者--help选项,显示帮助信息

    opts, args = getopt.getopt(sys.argv[1:], 'hsf:')
    

    argsdict = {}
    for opt_name, opt_value in opts:
    argsdict[opt_name]=opt_value

    if  '-h' in argsdict: #帮助信息
    print(helpdoc)
    sys.exit()

    参数信息不足,显示帮助信息

    opts, args = getopt.getopt(sys.argv[1:], 'hsf:')
    

     

    if len(args) < 5:  # file,port,username,passeord,command1,[command2]...
    print(helpdoc)
    sys.exit()

    获取参数信息

    opts, args = getopt.getopt(sys.argv[1:], 'hsf:')
    

    file, port, username, password, *commands = args
    

     

    选项列表转化为字典

    opts, args = getopt.getopt(sys.argv[1:], 'hsf:')
    

    for opt_name, opt_value in opts:
    argsdict[opt_name]=opt_value

     

    选项信息不足,提示缺少选项


    ip,port = None,None
    for
    opt_name,opt_value in opts:
    if opt_name in ['-h', '--help']:
    print('help doc')
    sys.exit()
    if opt_name in ['-i', '--ip']: ip = opt_value
    if opt_name in ['--port']: port = opt_value


    if not ip:
    print('ip not exit')
    sys.exit()
    if not port:
    print('port not exit')
    sys.exit()

     

    处理选项与参数

    处理选项

    • 可以将选项列表转化为字典,然后判断选项是否在字典中

      带参数的选项使用vaule = dict.get(key),

      如果存在则返回参数值,如果不存在参数值为None,也可以dict.get(key,default)指定默认参数值

      不带参数的选项使用in判断

    • 可以直接处理(选项,参数)元组组成的列表,循环处理

      为了防止运行脚本时,提交选项不足,使得参数未获取到值,可以先赋值变量值为空字符串或None,

      然后再判断变量值,如果为空字符串或者None,中断程序,提示参数不足

    处理参数

    参数被收集到args列表中,是顺序的,所以针对列表

    • len()判断参数个数
    • 如果不需要进一步处理,直接传参列表args,或者列表解包*args
    • 如果需要进一步处理,列表解包,file, port, username, password, *commands = args,再传参
    • 函数fun形参为arge形式,表示只接受一个参数,调用时传入列表,fun(commands)
    • 函数fun形参为*arge形式,表示接受多个参数,调用时传入解包列表,fun(*command)

    示例4:模板

    代码:

    import sys,getopt

    def fun(ip,port,args):
    if flag :
    print('True',ip,port,args)
    else:
    print('false',ip,port,args)

    #不加参数提示帮助信息,或者运行函数
    if len(sys.argv[1:]) == 0:
    print('help doc')
    sys.exit()
    try: #getopt函数放到try里面,防止脚本调用时,出现不期望的参数,会报错
    opts, args = getopt.getopt(sys.argv[1:], 'hsi:', ['help','ip=','port='])
    except Exception as e:
    print(e)
    sys.exit()
    #先分析选项
    ip,port = None,None #提前赋值变量,然后分析getopt的返回结果,再对变量值进行判断,适用于必须的选项
    flag = False #标志位,先置于False,再分析getopt的返回结果,如果存在标志位,再置为True,再在函数中判断标志位,作出不同的响应
    for opt_name,opt_value in opts:
    if opt_name in ['-h', '--help']: #帮助信息
    print('help doc')
    sys.exit()
    if opt_name in ['-i', '--ip']: ip = opt_value #必须参数
    if opt_name in ['--port']: port = opt_value #必须参数
    if opt_name in ['-s']:flag = True #功能性参数,标志位
    #
    if not ip:
    print('ip not exit')
    sys.exit()
    if not port:
    print('port not exit')
    sys.exit()

    #再分析参数
    if len(args) < 1: # 判断参数个数
    print('helpdoc')
    sys.exit()
    else:
    fun(ip,port,args) #如果选项都存在且不为空字符串,参数个数也齐全,再执行函数

    运行:

    D:projects uncmd>python test.py -i 192.168.0.1 --port=22 file1

    false 192.168.0.1 22 ['file1']

     

    D:projects uncmd>python test.py -s -i 192.168.0.1 --port=22 file1

    True 192.168.0.1 22 ['file1']

     

    D:projects uncmd>python test.py -i 192.168.0.1 --port=22 file1 file2

    false 192.168.0.1 22 ['file1', 'file2']

     

    D:projects uncmd>python test.py -s -i 192.168.0.1 --port=22 file1 file2

    True 192.168.0.1 22 ['file1', 'file2']

     

     

  • 相关阅读:
    作业任务03
    作业任务02
    作业任务01
    Shell脚本编程01-shell编程与规范与变量
    Linux网络服务05-----DNS域名解析服务(二)
    Linux网络服务05-----DNS域名解析服务(一)
    Linux网络服务13----PXE 高效能批量网络装机
    网络基础知识
    Nginx 入门
    shell 脚本须知
  • 原文地址:https://www.cnblogs.com/jeancheng/p/13339855.html
Copyright © 2011-2022 走看看