python getopt模块的使用

0. 学习背景

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

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

上述这种使用命令行传参的执行方式,在很多场景中都会用到。通过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 getopt的传参和返回值
def getopt(args, shortopts, longopts = []):
	"""
	params:args是用来解析的命令行字符串,通常为sys.argv[1:]
	params:shortopts是用来匹配命令行中的短参数,为字符串类型
	parmas:longopts是用来匹配命令行中的长参数,为列表类型
	return:opts为列表嵌套元组类型,用来存放解析好的参数和值
	return:args为列表类型,用来存放不匹配的命令行参数
	"""
	...
	return opts, args

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)

调用方式:

python practise.py -v

输出结果:

opts is  [('-v', '')]
args is  []
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)

调用方式:

python practise.py -v 20

输出结果:

opts is  [('-v', '20')]
args is  []
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)

调用方式:

python practise.py -v 20 -f demo

输出结果:

opts is  [('-v', '20'), ('-f', 'demo')]
args is  []
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)

调用方式:

python practise.py --filename=

输出结果:

opts is  [('--filename', '')]
args is  []
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)

调用方式:

python practise.py --filename=demo

输出结果:

opts is  [('--filename', 'demo')]
args is  []
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)

调用方式:

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

输出结果:

opts is  [('--filename', 'demo'), ('--version', '20')]
args is  []
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)

调用方式:

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

输出结果:

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

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)
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.参数名获取值
    
  2. 不同之处
    1. getopt不能预设值,即没有默认值,全依赖命令行的输入;argparse可以设置默认值,更加灵活
    2. 应用场景不同,getopt更多应用于命令行输入参数值,开启某些功能,argparse则是摆脱IDEA的限制,很灵活的配置命令行参数(再议)
    

5. 参考文献

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

你可能感兴趣的:(Python3,python)