• python getopt模块的使用


    0. 学习背景

    使用命令行窗口执行某些py文件时,往往会传入一些参数,如:

    python practise.py --help='this is my name' -v 20
    
    • 1

    上述这种使用命令行传参的执行方式,在很多场景中都会用到。通过getopt.getopt()可以提取到这些参数。

    1. 函数定义及返回值

    1.1 函数原型

    函数的源代码如下:

    def getopt(args, shortopts, longopts = []):
    	"""args和shortopts属于必传参数,longopts为非必传参数"""
        opts = []
        if type(longopts) == type(""):
            longopts = [longopts]
        else:
            longopts = list(longopts)
        while args and args[0].startswith('-') and args[0] != '-':
            if args[0] == '--':
                args = args[1:]
                break
            if args[0].startswith('--'):  # 用来处理长参数
                opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
            else:  # 用来处理短参数
                opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
    
        return opts, args
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1.2 getopt的传参和返回值

    def getopt(args, shortopts, longopts = []):
    	"""
    	params:args是用来解析的命令行字符串,通常为sys.argv[1:]
    	params:shortopts是用来匹配命令行中的短参数,为字符串类型
    	parmas:longopts是用来匹配命令行中的长参数,为列表类型
    	return:opts为列表嵌套元组类型,用来存放解析好的参数和值
    	return:args为列表类型,用来存放不匹配的命令行参数
    	"""
    	...
    	return opts, args
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2. 函数传参的不同形式

    对应命令行传参可分为以下七种情况:

    2.1 短参数无值

    此时getopt的shortopts应传入"v",即getopt.getopt(args, "v")

    import sys
    import getopt
    
    
    if __name__ == "__main__":
        opts, args = getopt.getopt(sys.argv[1:], "v")
    
        print("opts is ", opts)
        print("args is ", args)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    调用方式:

    python practise.py -v
    
    • 1

    输出结果:

    opts is  [('-v', '')]
    args is  []
    
    • 1
    • 2

    2.2 短参数有值

    此时getopt的shortopts应传入"v:",即getopt.getopt(args, "v:")

    import sys
    import getopt
    
    
    if __name__ == "__main__":
        opts, args = getopt.getopt(sys.argv[1:], "v:")
    
        print("opts is ", opts)
        print("args is ", args)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    调用方式:

    python practise.py -v 20
    
    • 1

    输出结果:

    opts is  [('-v', '20')]
    args is  []
    
    • 1
    • 2

    2.3 短参数有多个值

    此时getopt的shortopts应传入"f:v:",即getopt.getopt(args, "f:v:")

    import sys
    import getopt
    
    
    if __name__ == "__main__":
        opts, args = getopt.getopt(sys.argv[1:], "f:v:")
    
        print("opts is ", opts)
        print("args is ", args)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    调用方式:

    python practise.py -v 20 -f demo
    
    • 1

    输出结果:

    opts is  [('-v', '20'), ('-f', 'demo')]
    args is  []
    
    • 1
    • 2

    2.4 长参数无值

    此时getopt的longopts应传入[“filename=”],即getopt.getopt(args, "", ["filename="])

    import sys
    import getopt
    
    
    if __name__ == "__main__":
    	# shortopts是必传参数,不可省略,传入''也行
        opts, args = getopt.getopt(sys.argv[1:], "", longopts=["filename="])
    
        print("opts is ", opts)
        print("args is ", args)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    调用方式:

    python practise.py --filename=
    
    • 1

    输出结果:

    opts is  [('--filename', '')]
    args is  []
    
    • 1
    • 2

    2.5 长参数有值

    此时getopt的longopts应传入[“filename=”],即getopt.getopt(args, "f:", ["filename="])

    import sys
    import getopt
    
    
    if __name__ == "__main__":
    	# shortopts是必传参数,不可省略,传入''也行
        opts, args = getopt.getopt(sys.argv[1:], "", longopts=["filename="])
    
        print("opts is ", opts)
        print("args is ", args)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    调用方式:

    python practise.py --filename=demo
    
    • 1

    输出结果:

    opts is  [('--filename', 'demo')]
    args is  []
    
    • 1
    • 2

    2.6 长参数有多个值

    此时getopt的longopts应传入[“filename=”, “version=”],即getopt.getopt(args, "f:", ["filename=", "version="])

    import sys
    import getopt
    
    
    if __name__ == "__main__":
    	# shortopts是必传参数,不可省略,传入''也行
        opts, args = getopt.getopt(sys.argv[1:], "", longopts=["filename=", "version="])
    
        print("opts is ", opts)
        print("args is ", args)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    调用方式:

    python practise.py --filename=demo --version=20
    
    • 1

    输出结果:

    opts is  [('--filename', 'demo'), ('--version', '20')]
    args is  []
    
    • 1
    • 2

    2.7 既有短参数又有长参数

    import sys
    import getopt
    
    
    if __name__ == "__main__":
    	# shortopts是必传参数,不可省略,传入''也行
        opts, args = getopt.getopt(sys.argv[1:], "f:v:", longopts=["filename=", "version="])
    
        print("opts is ", opts)
        print("args is ", args)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    调用方式:

    python practise.py --filename=demo -v 20
    
    • 1

    输出结果:

    opts is  [('--filename', 'demo'), ('-v', '20')]
    args is  []
    
    • 1
    • 2

    2.8 一些特殊情况

    1. 对于python practise.py -s this is my name这种情况,最终获得的结果为
      opts is  [('-h', 'this')]
      args is  ['is', 'my', 'name']
      # 由此示例可知,args是用来存用不匹配的命令行输入参数
      
      • 1
      • 2
      • 3
      解决方案:
      # 使用如下命令
      python practise.py -h 'this is my name'
      # 最终结果为:
      opts is  [('-h', 'this is my name')]
      args is  []
      
      • 1
      • 2
      • 3
      • 4
      • 5

    3. 总结

    • 短参数的调用方式为:-参数名(空格)值
    • 长参数的调用方式为:--参数名=值
    • 注:如果值是类似this is my name中间有空格的字符串,则需要使用’'将其括起

    4. 与argparse的区别(待补充)

    4.1 基本使用规则

    # 导包
    import argparse
    
    
    def parse_args():
    	# 创建参数解析器
        parser = argparse.ArgumentParser(description="this is a demo")
    
        help = "this is an integer"
        # 添加参数
        parser.add_argument("integer", nargs="+", type=int, required=True, help=help)
        # 调用parse_args解析命令行参数
        args = parser.parse_args()
        return args
    
    
    if __name__ == "__main__":
        args = parse_args()
        # 通过args.参数名即可获取参数值
        print(args.integer)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4.2 与getopt.getopt的相同之处与不同之处

    1. 两者都可以用来解析命令行参数
      # 1. getopt.getopt
      opts, args =getopt.getopt(sys.argv[1:], "hf:v:", ["help", "filename=", "version"])
      # opts中存放的是匹配的参数和对应的值
      
      # 2. argparse
      parser = argparse.ArgumentParser()
      parser.add_argument(...) # 用来指定参数(位置参数和可选参数)
      args = parser.parse_args()
      # 通过args.参数名获取值
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    2. 不同之处
      1. getopt不能预设值,即没有默认值,全依赖命令行的输入;argparse可以设置默认值,更加灵活
      2. 应用场景不同,getopt更多应用于命令行输入参数值,开启某些功能,argparse则是摆脱IDEA的限制,很灵活的配置命令行参数(再议)
      
      • 1
      • 2

    5. 参考文献

    argparse模块的学习
    getopt模块的学习

  • 相关阅读:
    PY32F003F18之PWM互补输出
    MySQL8.0安装教程
    ESP8266使用记录(四)
    zabbix监控实战
    R语言条件判断语句编程:使用if/else语句实现条件逻辑判断、使用any函数判断向量中的值是否部分满足条件
    PWN学习资料整理——(二)基础
    企业专线成本高?贝锐蒲公英轻松实现财务系统远程访问
    常见数据库介绍对比之NoSQL非关系型数据库
    Linux python运维
    开发者生态:共享知识,携手共进,共创技术辉煌
  • 原文地址:https://blog.csdn.net/belong_to_you/article/details/126137090