前言
docopt 是一個開源的庫,代碼地址:https://github.com/docopt/docopt。它在 README 中就已經做了詳細的介紹,并且還附帶了很多例子可供學習,這篇文章也是翻譯一下 README 中內容……
docopt 最大的特點在于不用考慮如何解析命令行參數,而是當你把心中想要的格式按照一定的規則寫出來后,解析也就完成了。
docopt的安裝
docopt有很多種版本,分別支持不同的語言,最簡答的docopt支持python腳本,docopt.java支持java腳本,docopts則是支持shell腳本的(下面的例子主要以docopts為例),具體的可以參見github的docopt說明
安裝docopt
以mac os x為例安裝,安裝docopts前首先需要安裝docopt,有兩種安裝方法
方法一
比較簡單的方法是直接用 pip 安裝, pip install docopt==0.6.2
有些mac可能不支持直接pip 指令,需要先安裝pip
方法二
也可以在github上下載源碼(docopt是開源項目),然后通過python setup.py install
安裝
安裝docopts
安裝docopts就必須使用上面安裝docopt的方法二,在GitHub上下載源碼,然后 使用python安裝,下載地址
docopt 的實現簡單分析
在 Python 中有這么一個屬性 __doc__
,它的值是字符串,一般表示幫助信息,而 docopt 正是利用了這一屬性,把幫助信息替換成命令行參數解析說明,再對它進行解析即可。
舉個 docopt 中的例子來說明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
"""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) |
上述代碼段中,很大一段幫助信息就是我們的命令行參數解析說明,在函數入口處調用docopt函數進行解析,返回的arguments變量是一個字典型變量,它記錄了選項是否被選用了,參數的值是什么等信息,當程序從命令行運行時,我們就是根據arguments變量的記錄來得知用戶輸入的選項和參數信息。
所以如何寫好命令行參數解析說明就變得至關重要了,命令行解析信息包含兩部分,分別是使用模式格式和選項描述格式。
使用模式格式(Usage pattern format)
使用模式以usage:開始,以空行結束,如上代碼段所示,它主要描述了用戶添加命令行參數時的格式,也就是使用時的格式,解析也是按照此格式來進行的。
每一個使用模式都包含如下元素:
* 參數
參數使用大寫字母或者使用尖括號<>圍起來。
* 選項
選項以短橫線開始-或者--。只有一個字母時格式-o,多于一個字母時--output。同時還可以把多個單字母的選項合并,-ovi等同于-o、-v、-i。選項也能有參數,此時別忘了給選項添加描述說明。
接下來是使用模式中用到的一些標識的含義,正確地使用他們能夠更好的完成解析任務:
* []
代表可選的元素,方括號內的元素可有可無
* ()
代表必須要有的元素,括號內的元素必須要有,哪怕是多個里面選一個。
* |
互斥的元素,豎線兩旁的元素只能有一個留下
* ...
代表元素可以重復出現,最后解析的結果是一個列表
* [options]
指定特定的選項,完成特定的任務。
選項描述格式(Option description format)
選項描述同樣必不可少,尤其是當選項有參數,并且還需要為它賦默認值時。
為選項添加參數的格式有兩種:
1
2
|
- o FILE - - output - FILE # 不使用逗號,使用 = 符號 - i < file >, - - input < file > # 使用逗號,不使用 = 符號 |
為選項添加描述說明,只需要用兩個空格分隔選項和說明即可。
為選項添加默認值時,把它添加到選擇描述后面即可,格式如下[default: <my-default-value>]
1
2
3
|
- - coefficient = K The K coefficient [default: 2.95 ] - - output = FILE Output file [default: test.txt] - - directory = DIR Some directory [default: . / ] |
如果選項是可以重復的,那么它的值[default: ...]
將會一個 list列表,若不可以重復,則它的值是一個字符串。
使用
理解了 使用模式格式 和 選項描述格式 之后,再配合給出的例子就能較好的理解了。
接下來就是得到輸入的信息了。
在前面提到arguments參數是一個字典類型,包含了用戶輸入的選項和參數信息,還是上面的代碼段例子,假如我們從命令行運行的輸入是
1
|
python3 test.py ship Guardian move 100 150 - - speed = 15 |
那么打印arguments參數如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
{ '--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 } |
從打印信息可以看到,對于選項,使用布爾型來表示用戶是否輸入了該選項,對于參數,則使用具體值來表述。
這樣一來,程序就可以從arguments變量中得到下一步的操作了。若是用戶什么參數都沒輸入,則打印Usage說明提示輸入內容。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
原文鏈接:http://www.glumes.com/how-to-use-docopt/