常用三种解析方法:
方式一:解析系统sys.argv[]参数列表
def parse_sys_argv(): ????????print({'argv[0]':sys.argv[0],'argv[1]':sys.argv[1],'argv':sys.argv})
# 执行命令:python argv.py param1 param2 # 打印结果:{'argv[0]': 'argv.py', 'argv[1]': 'param1', 'argv': ['argv.py', 'param1', 'param2']}
方式二:通过getopt解析sys.argv[1:]
def parse_sys_argv_by_getopt(): ?? ??? ?try: ?? ??? ??? ??? ?options, args = getopt.getopt(sys.argv[1:],'p:i:v:m:t:') ?? ??? ?except getopt.GetoptError as e: ?? ??? ??? ??? ?print({"getopt except":e.msg, 'option':e.opt}) ?? ??? ??? ??? ?sys.exit(1) ?? ??? ?print({'options':options,'args':args})
# 输入正常支持选项时: # 执行命令:python argv.py? -p path -i input -v 3_0 -m master -t time # 打印结果:{'options': [('-p', 'path'), ('-i', 'input'), ('-v', '3_0'), ('-m', 'master'), ('-t', 'time')], 'args': []} # 输入不支持选项时:抛异常 # 执行命令:python argv.py? -p path -i input -x y # 打印结果:{'getopt except': 'option -x not recognized', 'option': 'x'}?
方式三:通过argparse解析参数
# 步骤1:创建ArgumentParser()对象 # 步骤2:调用add_argument()方法添加选项参数 # 步骤3:调用parse_agrs()解析添加的选项参数
def parse_argparse(): ?? ??? ?description = "This is argparse test" ?? ??? ?parser = argparse.ArgumentParser(description=description) ?? ??? ?parser.add_argument('positional',default=r'定位参数',help='必须输入的参数') ?? ??? ?default_path = os.path.dirname(__file__) ?? ??? ?parser.add_argument('-p','--path',dest='filePath', default=default_path,help='fiel path') ?? ??? ?parser.add_argument('-a','--paramA',default=2,type=int, help='input int') ?? ??? ?#default:参数默认值 ?? ??? ?#dest:解析后的属性名,当没有指定dest时,解析后的属性名是--param中param,这是可选参数 ?? ??? ?#当没有'-'和'--'表示必选参数,-是--的简写 ?? ??? ?args = parser.parse_args() ?? ??? ?print({'args.positional':args.positional}) ?? ??? ?print({'args.filePath':args.filePath}) ?? ??? ?print({'args.paramA':args.paramA}) ?? ??? ?print({'args':args})
# 执行命令:python argv.py -p /home -a 255 当不输入定位参数选项时 # usage: argv.py [-h] [-p FILEPATH] [-a PARAMA] positional # argv.py: error: the following arguments are required: positional # 执行命令:python argv.py -p /home -a 255 "positional param"?? ? # {'args.positional': 'positional param'} # {'args.filePath': '/home'} # {'args.paramA': 255} # {'args': Namespace(filePath='/home', paramA=255, positional='positional param')}
?应用技巧:通过main.py来控制流程
创建argvparse.py,内容如下:
# encoding=utf-8 import sys
# 方式一:解析系统sys.argv[]参数列表 def parse_sys_argv(): ????????if len(sys.argv) < 2: return ????????print({'argv[0]':sys.argv[0],'argv[1]':sys.argv[1],'argv':sys.argv})
if __name__ == '__main__': ????????parse_sys_argv()
创建getoptparse.py,内容如下:
# encoding=utf-8 import getopt import sys
# 方式二:通过getopt解析sys.argv[1:] def parse_sys_argv_by_getopt(): ?? ??? ?try: ?? ??? ??? ??? ?options, args = getopt.getopt(sys.argv[1:],'p:i:v:m:t:') ?? ??? ?except getopt.GetoptError as e: ?? ??? ??? ??? ?print({"getopt except":e.msg, 'option':e.opt}) ?? ??? ??? ??? ?sys.exit(1) ?? ??? ?print({'options':options,'args':args})
if __name__ == '__main__': ?? ?parse_sys_argv_by_getopt()
创建argparserparse.py,内容如下:
# encoding=utf-8 import sys,os import argparse
def parse_argparse(): ?? ??? ?description = "This is argparse test" ?? ??? ?parser = argparse.ArgumentParser(description=description) ?? ??? ?parser.add_argument('positional',default=r'定位参数',help='必须输入的参数') ?? ??? ?default_path = os.path.dirname(__file__) ?? ??? ?parser.add_argument('-p','--path',dest='filePath', default=default_path,help='fiel path') ?? ??? ?parser.add_argument('-a','--paramA',default=2,type=int, help='input int') ?? ??? ?#default:参数默认值 ?? ??? ?#dest:解析后的属性名,当没有指定dest时,解析后的属性名是--param中param,这是可选参数 ?? ??? ?#当没有'-'和'--'表示必选参数,-是--的简写 ?? ??? ?args = parser.parse_args() ?? ??? ?print({'args.positional':args.positional}) ?? ??? ?print({'args.filePath':args.filePath}) ?? ??? ?print({'args.paramA':args.paramA}) ?? ??? ?print({'args':args})
if __name__ == '__main__': ?? ?parse_argparse()
创建main.py,内容如下:
#encoding='utf-8'
import os
print("方式一:解析系统sys.argv[]参数列表:") os.system("python argvparse.py param1 param2") print('***'*30)
print("方式二:通过getopt解析sys.argv[1:]:") print("输入正常支持选项时:") os.system("python getoptparse.py -p path -i input -v 3_0 -m master -t time") print('***'*30) print("输入不支持选项时:抛异常:") os.system("python getoptparse.py -p path -i input -x y") print('***'*30)
print("方式三:通过argparse解析参数:") print("当不输入定位参数选项时:") os.system("python argparserparse.py -p /home -a 255") print('***'*30) print("当输入定位参数选项时:") os.system('python argparserparse.py -p /home -a 255 "positional param"') print('***'*30)
执行结果如下:
?
ArgumentParser和add_argument参数概述:
详见:argparse --- 命令行选项、参数和子命令解析器 — Python 3.11.0a7 文档
argparse.ArgumentParser( ?? ??? ?prog=None, ?? ??? ?usage=None, ?? ??? ?description=None, ?? ??? ?epilog=None, ?? ??? ?parents=[], ?? ??? ?formatter_class=HelpFormatter, ?? ??? ?prefix_chars='-', ?? ??? ?fromfile_prefix_chars=None, ?? ??? ?argument_default=None, ?? ??? ?conflict_handler='error', ?? ??? ?add_help=True, ?? ??? ?allow_abbrev=True) 创建一个新的 ArgumentParser对象。所有的参数都应当作为关键字参数传入。每个参数在下面都有它更详细的描述: 【prog】:程序的名称(默认值:sys.argv[0]) 【usage】:描述程序用途的字符串(默认值:从添加到解析器的参数生成) 【description】:在参数帮助文档之前显示的文本(默认值:无) 【epilog】:在参数帮助文档之后显示的文本(默认值:无) 【parents】:一个 ArgumentParser 对象的列表,它们的参数也应包含在内 【formatter_class】:用于自定义帮助文档输出格式的类 【prefix_chars】:可选参数的前缀字符集合(默认值: '-') 【fromfile_prefix_chars】:当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值: None) 【argument_default】:参数的全局默认值(默认值: None) 【conflict_handler】:解决冲突选项的策略(通常是不必要的) 【add_help】:为解析器添加一个 -h/--help 选项(默认值: True) 【allow_abbrev】:如果缩写是无歧义的,则允许缩写长选项 (默认值:True),该参数还会禁用短旗标分组,例如 -vv 表示为 -v-v。
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) 【name or flags】:一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。 【action】:当参数在命令行中出现时使用的动作基本类型。 【nargs】:命令行参数应当消耗的数目。 【const】:被一些 action 和 nargs 选择所需求的常数。 【default】:当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。 【type】:命令行参数应当被转换成的类型。 【choices】:可用的参数的容器。 【required】:此命令行选项是否可省略(仅选项可用)。 【help】:一个此选项作用的简单描述。 【metavar】:在使用方法消息中使用的参数值示例。 【dest】:被添加到 parse_args() 所返回对象上的属性名。
|