Python中的命令行參數(shù)解析工具之docopt詳解
前言
docopt 是一個(gè)開(kāi)源的庫(kù),代碼地址:https://github.com/docopt/docopt。它在 README 中就已經(jīng)做了詳細(xì)的介紹,并且還附帶了很多例子可供學(xué)習(xí),這篇文章也是翻譯一下 README 中內(nèi)容……
docopt 最大的特點(diǎn)在于不用考慮如何解析命令行參數(shù),而是當(dāng)你把心中想要的格式按照一定的規(guī)則寫(xiě)出來(lái)后,解析也就完成了。
docopt的安裝
docopt有很多種版本,分別支持不同的語(yǔ)言,最簡(jiǎn)答的docopt支持python腳本,docopt.java支持java腳本,docopts則是支持shell腳本的(下面的例子主要以docopts為例),具體的可以參見(jiàn)github的docopt說(shuō)明
安裝docopt
以mac os x為例安裝,安裝docopts前首先需要安裝docopt,有兩種安裝方法
方法一
比較簡(jiǎn)單的方法是直接用 pip 安裝, pip install docopt==0.6.2
有些mac可能不支持直接pip 指令,需要先安裝pip
方法二
也可以在github上下載源碼(docopt是開(kāi)源項(xiàng)目),然后通過(guò)python setup.py install
安裝
安裝docopts
安裝docopts就必須使用上面安裝docopt的方法二,在GitHub上下載源碼,然后 使用python安裝,下載地址
docopt 的實(shí)現(xiàn)簡(jiǎn)單分析
在 Python 中有這么一個(gè)屬性 __doc__
,它的值是字符串,一般表示幫助信息,而 docopt 正是利用了這一屬性,把幫助信息替換成命令行參數(shù)解析說(shuō)明,再對(duì)它進(jìn)行解析即可。
舉個(gè) docopt 中的例子來(lái)說(shuō)明:
"""Naval Fate. Usage: naval_fate.py ship new <name>... naval_fate.py ship <name> move <x> <y> [--speed=<kn>] naval_fate.py ship shoot <x> <y> naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting] naval_fate.py (-h | --help) naval_fate.py --version Options: -h --help Show this screen. --version Show version. --speed=<kn> Speed in knots [default: 10]. --moored Moored (anchored) mine. --drifting Drifting mine. """ from docopt import docopt if __name__ == '__main__': arguments = docopt(__doc__, version='Naval Fate 2.0') print(arguments)
上述代碼段中,很大一段幫助信息就是我們的命令行參數(shù)解析說(shuō)明,在函數(shù)入口處調(diào)用docopt函數(shù)進(jìn)行解析,返回的arguments變量是一個(gè)字典型變量,它記錄了選項(xiàng)是否被選用了,參數(shù)的值是什么等信息,當(dāng)程序從命令行運(yùn)行時(shí),我們就是根據(jù)arguments變量的記錄來(lái)得知用戶輸入的選項(xiàng)和參數(shù)信息。
所以如何寫(xiě)好命令行參數(shù)解析說(shuō)明就變得至關(guān)重要了,命令行解析信息包含兩部分,分別是使用模式格式和選項(xiàng)描述格式。
使用模式格式(Usage pattern format)
使用模式以u(píng)sage:開(kāi)始,以空行結(jié)束,如上代碼段所示,它主要描述了用戶添加命令行參數(shù)時(shí)的格式,也就是使用時(shí)的格式,解析也是按照此格式來(lái)進(jìn)行的。
每一個(gè)使用模式都包含如下元素:
* 參數(shù)
參數(shù)使用大寫(xiě)字母或者使用尖括號(hào)<>圍起來(lái)。
* 選項(xiàng)
選項(xiàng)以短橫線開(kāi)始-或者--。只有一個(gè)字母時(shí)格式-o,多于一個(gè)字母時(shí)--output。同時(shí)還可以把多個(gè)單字母的選項(xiàng)合并,-ovi等同于-o、-v、-i。選項(xiàng)也能有參數(shù),此時(shí)別忘了給選項(xiàng)添加描述說(shuō)明。
接下來(lái)是使用模式中用到的一些標(biāo)識(shí)的含義,正確地使用他們能夠更好的完成解析任務(wù):
* []
代表可選的元素,方括號(hào)內(nèi)的元素可有可無(wú)
* ()
代表必須要有的元素,括號(hào)內(nèi)的元素必須要有,哪怕是多個(gè)里面選一個(gè)。
* |
互斥的元素,豎線兩旁的元素只能有一個(gè)留下
* ...
代表元素可以重復(fù)出現(xiàn),最后解析的結(jié)果是一個(gè)列表
* [options]
指定特定的選項(xiàng),完成特定的任務(wù)。
選項(xiàng)描述格式(Option description format)
選項(xiàng)描述同樣必不可少,尤其是當(dāng)選項(xiàng)有參數(shù),并且還需要為它賦默認(rèn)值時(shí)。
為選項(xiàng)添加參數(shù)的格式有兩種:
-o FILE --output-FILE # 不使用逗號(hào),使用 = 符號(hào) -i <file>, --input <file> # 使用逗號(hào),不使用 = 符號(hào)
為選項(xiàng)添加描述說(shuō)明,只需要用兩個(gè)空格分隔選項(xiàng)和說(shuō)明即可。
為選項(xiàng)添加默認(rèn)值時(shí),把它添加到選擇描述后面即可,格式如下[default: <my-default-value>]
--coefficient=K The K coefficient [default: 2.95] --output=FILE Output file [default: test.txt] --directory=DIR Some directory [default: ./]
如果選項(xiàng)是可以重復(fù)的,那么它的值[default: ...]
將會(huì)一個(gè) list列表,若不可以重復(fù),則它的值是一個(gè)字符串。
使用
理解了 使用模式格式 和 選項(xiàng)描述格式 之后,再配合給出的例子就能較好的理解了。
接下來(lái)就是得到輸入的信息了。
在前面提到arguments參數(shù)是一個(gè)字典類型,包含了用戶輸入的選項(xiàng)和參數(shù)信息,還是上面的代碼段例子,假如我們從命令行運(yùn)行的輸入是
python3 test.py ship Guardian move 100 150 --speed=15
那么打印arguments參數(shù)如下:
{'--drifting': False, '--help': False, '--moored': False, '--speed': '15', '--version': False, '<name>': ['Guardian'], '<x>': '100', '<y>': '150', 'mine': False, 'move': True, 'new': False, 'remove': False, 'set': False, 'ship': True, 'shoot': False}
從打印信息可以看到,對(duì)于選項(xiàng),使用布爾型來(lái)表示用戶是否輸入了該選項(xiàng),對(duì)于參數(shù),則使用具體值來(lái)表述。
這樣一來(lái),程序就可以從arguments變量中得到下一步的操作了。若是用戶什么參數(shù)都沒(méi)輸入,則打印Usage說(shuō)明提示輸入內(nèi)容。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
Python3正則匹配re.split,re.finditer及re.findall函數(shù)用法詳解
這篇文章主要介紹了Python3正則匹配re.split,re.finditer及re.findall函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了正則匹配re.split,re.finditer及re.findall函數(shù)的概念、參數(shù)、用法及操作注意事項(xiàng),需要的朋友可以參考下2018-06-06Python數(shù)據(jù)處理pandas讀寫(xiě)操作IO工具CSV解析
這篇文章主要為大家介紹了Python?pandas數(shù)據(jù)讀寫(xiě)操作IO工具之CSV使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06python單向鏈表的基本實(shí)現(xiàn)與使用方法【定義、遍歷、添加、刪除、查找等】
這篇文章主要介紹了python單向鏈表的基本實(shí)現(xiàn)與使用方法,結(jié)合實(shí)例形式分析了Python單向鏈表的定義、遍歷、添加、刪除、查找等相關(guān)操作技巧,需要的朋友可以參考下2019-10-10python3字符串輸出常見(jiàn)面試題總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python3字符串輸出常見(jiàn)面試題總結(jié)內(nèi)容,有需要的朋友們可以參考下。2020-12-12python使用seaborn繪圖直方圖displot,密度圖,散點(diǎn)圖
這篇文章主要介紹了python使用seaborn繪圖直方圖displot,密度圖,散點(diǎn)圖,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07跟老齊學(xué)Python之從格式化表達(dá)式到方法
上一講,主要介紹了用%表達(dá)的一種輸出格式化表達(dá)式。在那一講最后又拓展了一點(diǎn)東西,拓展的那點(diǎn),名曰:格式化方法。因?yàn)樗R(shí)上是使用了str的format方法。2014-09-09Pandas修改DataFrame列名的兩種方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Pandas修改DataFrame列名的兩種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03