下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
pythongetopt参数参数⾃动补全_Python3+getoptargparse解析。。。⼀、说明在学C语⾔的时候就知道可以通过argc获取命令⾏参数个数,可以通过argv获取具体参数。但⾃⼰写的程序获取到的参数⼀是没有键值形式⼆是写的参数不能乱序,和系统命令不太⼀样。但这种位置参数⽤起来还是很不⽅便的,还是很有必要弄清系统命令的那种参数该如何实现。这⾥我们介绍经典的getopt和pythonic的argparse。⼆、getopt实现2.1程序代码此程序中设置-h/-n/-p三个选项,-h不带值-n和-p带值;三个参数设置等价长格式--help/--name/--profession。程序通过sys.argv[1:]来获取所有待解析参数,然后传到getopt进⾏解析,更多说明见代码注释。importgetoptimportsysdef_parse_option():try:#第⼀个参数argv----传过来的要解析的参数数组。形如['-n','ls','-p','programmer']#第⼆个参数"hn:p:"----⽤于向getopt注册短格式。没有:表⽰该参数不带值,有:表⽰下⼀参数为该参数的值#第三个参数[]----⽤于向getopt注册长格式。没有=表⽰该参数不带值,有=表⽰=号后边为其值(如果没有=号就以下⼀个参数为其值)#第三个参数[]----[]不是可选的意思,这⾥是代码,[]表⽰该参数是个数组#opts----以元组形式存放解析出的参数。形如[('-n','ls'),('-p','programmer'),('-h','')]#args----以数组形式存放按所有注册的格式未能解析参数#系统参数可通过sys.argv[index]来获取,sys.argv[0]是本⾝⽂件名print(f"willparseargv:{sys.argv[1:]}")opts,args=getopt.getopt(sys.argv[1:],"hn:p:",["help","name=","profession="])print(f"parsedargv:opts----{opts}args----{args}")exceptgetopt.GetoptError:#参数不符合注册格式要求报错print("parameterformaterror")_usage()sys.exit(2)options_dict={}#遍历所有元组#getopt只会严格按照注册的格式解析参数,⽽不理解哪个短格式与哪个长格式等价,等价是我们这⾥设定短格式和长格式⽤同⼀响应造成的#也就是说getopt并不理解-n和--name等价,他有-n就解析-n有--name就解析--name,两个都有就两个都解析。-n和--name等价是因为我们对这两个参数⽤同样的代码进⾏处理。#⽐如执⾏pythongetopt_test.py-nls--name=root,解析出的就是[('-n','ls'),('--name','root')]foropt,arginopts:#-h与--help等价ifoptin("-h","--help"):_usage()sys.exit()#-n与--name等价
elifoptin("-n","--name"):options_dict["user_name"]=arg#-p与--profession等价elifoptin("-p","--profession"):options_dict["user_profession"]=argreturnoptions_dict,argsdef_usage():print("getopt_testversion1.0")print("-hprintthismessage")print("-nequ--name")print("-pequ--profession")classTestGetopt:"""sys.argv[index]武断地以空格来划分参数,并不能区分选项和选项值sys.argv[index]不能乱序,取第⼀个参数为⽤户名,就必须在第⼀个参数输⼊⽤户名,不能在第⼆或别的地⽅输我们使⽤getopt模块来解决这两个问题"""def__init__(self):self.options_dict,self.args=_parse_option()deftest_use_arg(self):print(f"options:{self.options_dict}")print(f"args:{self.args}")print(f"youare{self.options_dict['user_profession']}{self.options_dict['user_name']}!")if__name__=="__main__":obj=TestGetopt()obj.test_use_arg()ViewCode2.2运⾏截图下图中依次以以下四种形式运⾏程序,观察getopt解析前后参数可对getopt有更直观理解pythongetopt_test.py-hpythongetopt_test.py-nls-pprogrammerpythongetopt_test.py-nls-pprogrammer--name=lsxpythongetopt_test.py-nls-pprogrammer--name=lsxother1other2三、argparse实现3.1程序代码python的getopt感觉就是C的封装,在使⽤上C的getopt类似,或者换⾔之还是⽐较⿇烦的。我们下边使⽤argparse实现类似的功能。直观感受上我们可以看到同样的功能代码量的减少,但其实更重要的是argparse多处理了很多我们没注意的细节,实际代码中也更推荐使⽤argparse。另外python3.2之前的版本参数解析库是optparse,⽤法和argparse类似且会被取代就不介绍了。importargparsedef_parse_option():"""所有要解析参数的⽂件加上这个函数"""parser=argparse.ArgumentParser()#默认会⾃动添加-h参数,-h的作⽤是打印各参数说明并使⽤exit退出。不想要原始的-h可设置add_help=False指⽰不⾃动添加#parser=argparse.ArgumentParser(add_help=False)#开头的⾮关键字参数--可以是-开头的短格式,也可以是--开头的长格式#action--参数操作动作#store(赋值)/store_const(赋给定的常量值)/store_true(赋true)/store_false(赋false)/append(多次出现时拼成列表)#count(赋出现的次数)/help(打印帮助)/version(打印--version参数)/extend(存成列表)。默认为store#nargs--消费其后多少个参数作为其值#const--当action为store_const时,要赋值变量的常量值
#default--当命令⾏没有该参数时,该参数的默认值。默认为None#type--变量类型。可以是所有python的变量类型,默认是str#choices--可给该参数传的值的可选列表#required--参数是否必须。默认为false#help--参数描述信息#metavar--参数赋值形式⽰例#dest--参数解析后赋值到的变量。默认先赋给dest,没有则赋给长格式,没有再赋给短格式#default--参数的默认值。默认为Noneparser.add_argument("-n","--name",metavar="NAME",dest="user_name",default="ls",type=str,help="getusername")parser.add_argument("-p","--profession",metavar="PROFESSION",dest="user_profession",help="getuserprofession")#options--argparse.Namespace类型,存储解析到的参数#args--list类型,存储其他⽆法解析的参数#parse_args()⽅法在遇到没有承接⽅的参数时会报错error:unrecognizedarguments:并直接exit退出#options=parser.parse_args()#args=None#parse_known_args()⽅法在遇到未注测的参数时会把它放⼊args⽽不是报错退出(options,args)=parser.parse_known_args()#默认解析sys.argv[1:],所以并不需要⾃⼰把sys.argv[1:]传过去。当然你也可以传⼊⾃⼰想解析的参数列表#(options,args)=parser.parse_known_args(["need","too","parse","param","list"])returnoptions,argsclassTestArgparse:"""所有要解析参数的类调⽤该函数进⾏解析即可"""def__init__(self):#options是optparse.Values类型并不是字典类型。optparse.Values类型可通过optparse.dest实现访问#args是列表类型self.options,self.args=_parse_option()deftest_use_arg(se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创新教育实践:《秋天的颜色》课件教学
- 《塑胶喷漆》课件
- 《尊师守纪主题班会》课件
- 电子银行课程设计
- 电子计步器课程设计
- 电子药盒创新课程设计
- 2024工厂的劳动合同
- 电子电工学课程设计
- 电子烟产业研究报告
- 2024xqwgovcnlawhtml租赁合同范本
- 2024年标准的公司劳动合同书(3篇)
- 高中语文教师资格考试学科知识与教学能力试卷及解答参考(2025年)
- 幼儿园大班健康《保护我们的牙齿》课件
- 2025届高考政治二轮复习参考题型专练一曲线图类含解析
- 中国全光网络建设行业需求现状调研与发展前景趋势分析研究报告(2024-2030版)
- 2024河南省科技馆招聘23人历年高频难、易错点500题模拟试题附带答案详解
- 广东省佛山市顺德区2024-2025学年三年级上学期月考英语试卷
- 中国电信:分布式智算中心无损网络技术白皮书
- 定制旅游行业市场深度分析报告
- Unit 6 Is he your grandpa?第一课时(教学设计+素材)-2023-2024学年译林版(三起)(2024)英语三年级上册
- 高中生物《蛋白质是生命活动的主要承担者》教学设计
评论
0/150
提交评论