• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Python中getopt模块的用法

  1. 学习背景
    使用命令行窗口执行某些py文件时,往往会传入一些参数,如:
    python practise.py --help='this is my name' -v 20
    上述这种使用命令行传参的执行方式,在很多场景中都会用到。通过getopt.getopt()可以提取到这些参数。
  2. 函数定义及返回值
    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
  1. 函数传参的不同形式
    对应命令行传参可分为以下七种情况:
    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✌️",即getopt.getopt(args, "f✌️")

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 一些特殊情况
对于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  []
  1. 总结
    短参数的调用方式为:-参数名(空格)值
    长参数的调用方式为:--参数名=值
    注:如果值是类似this is my name中间有空格的字符串,则需要使用’'将其括起
  2. 与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. 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. getopt不能预设值,即没有默认值,全依赖命令行的输入;argparse可以设置默认值,更加灵活
2. 应用场景不同,getopt更多应用于命令行输入参数值,开启某些功能,argparse则是摆脱IDEA的限制,很灵活的配置命令行参数(再议)

posted on 2022-08-26 23:25  SOC验证工程师  阅读(257)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3