Python參數(shù)解析模塊sys、getopt、argparse使用與對(duì)比分析
一些命令行工具的使用能夠大大簡化代碼腳本的維護(hù)成本,提升復(fù)用性,今天主要是借助于python提供的幾種主流的參數(shù)解析工具來實(shí)現(xiàn)簡單的功能,主要是學(xué)習(xí)實(shí)踐為主,這是新年伊始開工的第一篇,還是花了一番功夫來完成寫作的和實(shí)驗(yàn)的,希望能夠幫到需要的朋友們,新的一年里,祝大家心想事成!
好了,廢話不多說,下面進(jìn)入正文。
Python中有三個(gè)內(nèi)建的模塊用于處理命令行參數(shù):
第一個(gè):sys,最簡單,只能夠提供簡單的參數(shù)解析功能
第二個(gè):getopt,只能簡單的處理命令行參數(shù) ,較sys封裝更好一點(diǎn)
第三個(gè):argparse,使其更加容易的編寫用戶友好的命令行接口。它所需的程序進(jìn)程了參數(shù)定義,argparse將更好的解析 sys.argv。同時(shí)argparse模塊還能自動(dòng)生成幫助及用戶輸入錯(cuò)誤參數(shù)時(shí)的提示信息。
在命令行參數(shù)中分為“-”和“--”兩種模式,具體的使用方法以及與異同點(diǎn)我都會(huì)在下面的實(shí)際使用中介紹到,主要是正確完成對(duì)兩種命令參數(shù)模式的區(qū)分就行了。接下來的實(shí)踐中,首先以sys模塊為例,來觀察該模塊的參數(shù)解析過程,具體實(shí)踐如下:
def sysFunc(): ''' 基于 sys 模塊的簡單參數(shù)解析功能 選項(xiàng)的寫法要求: 對(duì)于短格式: "-"號(hào)后面要緊跟一個(gè)選項(xiàng)字母,如果還有此選項(xiàng)的附加參數(shù),可以用空格分開,也可以不分開。 長度任意,可以用引號(hào)。 如: -h -ls -l s 等等 對(duì)于長格式: "--"號(hào)后面要跟一個(gè)單詞,如果還有些選項(xiàng)的附加參數(shù),后面要緊跟"=",再加上參數(shù)。 "="號(hào)前后不能有空格。 如: --input=data.txt 長格式是在Linux下引入的,許多Linux程序都支持這兩種格式。在Python中提供了getopt模塊很好 的實(shí)現(xiàn)了對(duì)著兩種用法的支持,而且使用簡單。 執(zhí)行示例: python demo.py -d data.txt python demo.py --data=data.txt ''' if len(sys.argv)==1: print 'Nothing need to be done!' sys.exit() else: para_list=sys.argv print 'Parameters is: ',para_list if para_list[1].startswith('--'): print 'DataFile name is: ',para_list[1].split('=')[-1].strip() print 'Longopts,do your actions here!!!' elif para_list[1].startswith('-'): print 'DataFile name is: ',para_list[2] print 'Shortopts,do your actions here!!!'
關(guān)于該模塊的使用和注意事項(xiàng)我在上面的代碼片段中已經(jīng)解釋清楚了,相信很容易理解,我也附上了執(zhí)行示例,接下來我們執(zhí)行一下上述代碼結(jié)果如下:
接下來我們使用getopt模塊來進(jìn)行參數(shù)命令行的解析操作,代碼中我們選用IP和端口兩個(gè)屬性作為待傳入的參數(shù),具體實(shí)踐如下:
def getoptFunc(): ''' 基于 getopt 模塊來實(shí)現(xiàn)參數(shù)解析功能 函數(shù)getopt(args,shortopts,longopts=[]) 參數(shù)args一般是sys.argv[1:] shortopts 短格式 (-) longopts 長格式(--) 注意點(diǎn): 定義命令行參數(shù)時(shí),要先定義帶'-'選項(xiàng)的參數(shù),再定義沒有‘-'的參數(shù) 執(zhí)行示例: python demo.py -i 172.19.7.217 -p 8066 data.txt 88 python demo.py --ip=172.19.7.217 --port=8066 data.txt 88 ''' if len(sys.argv)==1: print 'Nothing need to be done!' sys.exit() try: opts,args=getopt.getopt(sys.argv[1:],"hp:i:",["help","ip=","port="]) #過濾掉腳本名稱 ''' opts是個(gè)包含元祖的列表,args是個(gè)列表,包含那些沒有‘-'或‘--'的參數(shù) 短格式 --- h 后面沒有冒號(hào):表示后面不帶參數(shù),p:和 i:后面有冒號(hào)表示后面需要參數(shù) 長格式 --- help后面沒有等號(hào)=,表示后面不帶參數(shù),其他三個(gè)有=,表示后面需要參數(shù) ''' print 'opts: ',opts print 'args: ',args except getopt.GetoptError: print "argv error,please input" sys.exit() #打印具體參數(shù) map_dict={'-i':'IP','--ip':'IP','-p':'Port','--port':'Port'} for name,value in opts: if name in ("-h","--help"): print """ Usage:sys.args[0] [option] -h or --help:顯示幫助信息 -p or --ip: IP地址 -p or --port: IP端口 """ if name in ('-i','--ip','-p','--port'): print '{0} is=======>{1}'.format(map_dict[name],value)
使用getopt模塊分析命令行參數(shù)大體上分為三個(gè)步驟:
- 1.導(dǎo)入getopt, sys模塊
- 2.分析命令行參數(shù)
- 3.處理結(jié)果
同樣我們加入了詳細(xì)的注釋與說明幫助理解該模塊的工作機(jī)制,我們也附上了相關(guān)的執(zhí)行示例,運(yùn)行上述代碼得到的結(jié)果如下圖所示:
最后我們實(shí)踐一下argparse模塊,該模塊相對(duì)于前兩個(gè)模塊而言,封裝程度更為高級(jí),使用也更為方便一下,具體的實(shí)踐如下:
def argparseFunc(): ''' 基于argparse模塊實(shí)現(xiàn)高級(jí)的參數(shù)解析功能 執(zhí)行示例: python demo.py -i 172.19.7.236 -p 7077 -f -w python demo.py -i 172.19.7.236 -p 7077 -f -r ''' parser=argparse.ArgumentParser(description="show example") #使用argparse的構(gòu)造函數(shù)來創(chuàng)建對(duì)象 parser.add_argument("-i","--ip",help="IP Address") #添加可解析的參數(shù) parser.add_argument("-p","--port",help="IP Port") #添加可解析的參數(shù) parser.add_argument("-f","--flag",help="Flag",action="store_true") #action=store_true的意義是如果使用了這個(gè)參數(shù)則值默認(rèn)為TRUE exptypegroup=parser.add_mutually_exclusive_group() #添加一組互斥的選項(xiàng),如上例中的-l和-r只能用一個(gè) exptypegroup.add_argument("-r","--read",help="Read Action",action="store_true") exptypegroup.add_argument("-w","--write",help="Write Action",action="store_true") ARGS=parser.parse_args() print 'ARGS:',ARGS if ARGS.ip: print "IP is: "+ARGS.ip if ARGS.port: print "Port is: "+ARGS.port if ARGS.flag: print "Flag is: "+str(ARGS.flag) if ARGS.read: print "Read action is: "+str(ARGS.read) if ARGS.write: print "Write action is: "+str(ARGS.write)
該模塊的使用較為廣泛,首先使用該模塊提供的構(gòu)造函數(shù)來創(chuàng)建一個(gè)ArgumentParser對(duì)象,后續(xù)的參數(shù)傳入和指定等工作都是基于ArgumentParser對(duì)象來進(jìn)行的,其中,add_argument用來添加參數(shù)對(duì)象選項(xiàng),add_mutually_exclusive_group用于添加互斥的選項(xiàng),比如:上述的讀操作和寫操作就是互斥的,上述代碼中我們給出了執(zhí)行示例,同樣我們依舊是基于IP和端口兩個(gè)參數(shù)選項(xiàng)進(jìn)行實(shí)驗(yàn),結(jié)果如下所示:
我們想知道,聲明好的互斥的參數(shù)選項(xiàng)是否真的是不能同時(shí)使用呢?這里簡單的執(zhí)行一下就行了:
從上面的error信息中我們看到了argparse模塊給我們的反饋信息是讀寫操作不被允許同時(shí)使用,說明了上述我們聲明的互斥參數(shù)是正常工作了的。
三個(gè)模塊,三種參數(shù)解析的實(shí)踐也只能是對(duì)其達(dá)到初步了解的目的,希望有了一定的了解與認(rèn)識(shí)之后再使用到具體的項(xiàng)目中去相信效果會(huì)更好一些。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- python中argparse模塊用法實(shí)例詳解
- Python解析命令行讀取參數(shù)--argparse模塊使用方法
- python argparse傳入布爾參數(shù)false不生效的解決
- Python的argparse庫使用詳解
- Python命令行解析器argparse詳解
- python argparser的具體使用
- 詳解Python命令行解析工具Argparse
- Python編程argparse入門淺析
- Python如何使用argparse模塊處理命令行參數(shù)
- Python argparse模塊使用方法解析
- Python argparse模塊應(yīng)用實(shí)例解析
- python?命令行參數(shù)模塊argparse的實(shí)現(xiàn)
相關(guān)文章
對(duì)Python3+gdal 讀取tiff格式數(shù)據(jù)的實(shí)例講解
今天小編就為大家分享一篇對(duì)Python3+gdal 讀取tiff格式數(shù)據(jù)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python讀取Excel一列并計(jì)算所有對(duì)象出現(xiàn)次數(shù)的方法
這篇文章主要給大家介紹了關(guān)于Python讀取Excel一列并計(jì)算所有對(duì)象出現(xiàn)次數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09