python解析命令行

getopt:和C中的getopt()等價(jià)雏胃。
optparse:2.7后已不推薦使用遗嗽。
argparse:基于optparse的新庫(kù)。
docopt:根據(jù)文檔描述臣缀,自動(dòng)生成坝橡。另一份參考文檔:docopt

更詳細(xì)的內(nèi)容可參考上述文檔精置。

getopt


若對(duì)C的getopt()函數(shù)不熟悉计寇,或者傾向于使用較少的代碼,或者需要對(duì)幫助信息和錯(cuò)誤信息有更高要求,以上情況優(yōu)先使用argparse番宁。
該模塊主要提供兩個(gè)函數(shù)元莫,以及一個(gè)異常判斷。

getopt.getopt(args, options[, long_options])
args是需要解析的列表蝶押,通常情況下踱蠢,是sys.argv[1:]
options是解析列表時(shí)使用的范式棋电,如果某一項(xiàng)(單個(gè)字母)后面需要參數(shù)茎截,則在此項(xiàng)后添加':'
long_options必須是字符串列表赶盔,字符串開(kāi)頭的'--'不能包括企锌,若某一項(xiàng)后面需要參數(shù),則在此項(xiàng)后添加'='招刨。可選型的參數(shù)是不支持long_options的哀军。是根據(jù)輸入是否是字符串列表中唯一一項(xiàng)的前綴來(lái)匹配的沉眶。
返回值分為兩個(gè)部分。第一部分是(option, value)格式的列表杉适,第二部分是解析完后剩余部分谎倔。

getopt.gnu_getopt(args, options[, long_options])
作用同上。
區(qū)別在于getopt()一旦遇到未配置的選項(xiàng)猿推,就會(huì)停止解析片习。而此函數(shù)使用GNU規(guī)則,即已配置的選項(xiàng)和未配置的選項(xiàng)是可以混雜的蹬叭。

exception getopt.GetoptError**
當(dāng)一個(gè)無(wú)法識(shí)別的選項(xiàng)藕咏,或者一個(gè)必須要有參數(shù)傳入的選項(xiàng)未傳入?yún)?shù)時(shí),拋出此異常秽五。
exception getopt.error**
GetoptError的舊名孽查,為了向后兼容而保留。

具體實(shí)例可參考文檔坦喘,不推薦使用盲再。

argparse


一個(gè)簡(jiǎn)單例子:

import argparse

parser = argparse.ArgumentParser(description='Example with long option names')

parser.add_argument('--noarg', action="store_true", default=False)
parser.add_argument('--witharg', action="store", dest="witharg")
parser.add_argument('--witharg2', action="store", dest="witharg2", type=int)

print parser.parse_args(['--noarg', '--witharg', 'val', '--witharg2=3'])

argparse中,最常用的就是上述三部分了:創(chuàng)建一個(gè)ArgumentParser對(duì)象瓣铣;使用add_argument()方法來(lái)為創(chuàng)建的ArgumentParser對(duì)象添加argument的解析規(guī)則答朋;最后調(diào)用parse_args()來(lái)解析傳入的內(nèi)容,依據(jù)的是第二步制定的規(guī)則棠笑,生成的是一個(gè)Namespace對(duì)象梦碗,若未傳參數(shù)給parse_args(),那么默認(rèn)從sys.argv來(lái)獲取命令行入?yún)ⅰ?/p>

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[],formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None,conflict_handler='error', add_help=True)
prog:程序的名字,默認(rèn)是argv[0]叉弦。若設(shè)置丐一,則在幫助信息中,可以使用%(prog)s來(lái)作為格式化的引用(修改一處全局受用)淹冰。
usage:幫助信息的usage字段库车,描述程序的各種用法,默認(rèn)情況下會(huì)依據(jù)add_argument()來(lái)自動(dòng)生成樱拴。
description:一個(gè)簡(jiǎn)單描述程序主要干啥以及怎么用的字符段柠衍。位于usage字符段和optional arguments字符段之間。
epilogoptional arguments字符段之后的字符段晶乔。
parents:繼承的父parser珍坊,為了避免一些公共的內(nèi)容重復(fù)定義,父parser在初始化時(shí)會(huì)設(shè)置add_help=False正罢,這是為了防止出現(xiàn)父與子parser的-h沖突而拋出異常履怯。
formatter_class:對(duì)于help輸出進(jìn)行格式化裆泳,除了輸出的樣式外运提,如果設(shè)置為ArgumentDefaultsHelpFormatter,則會(huì)自動(dòng)在help輸出中添加已定義的default值。
prefix_chars:options前的字符签钩,默認(rèn)為'-'莽鸿,可以添加其他字符兔沃,如'-+',但是如果沒(méi)有包括'-'窍侧,那么對(duì)應(yīng)的option如'-h'就無(wú)法解析议经。
fromfile_prefix_chars:有時(shí)會(huì)使用文件給parse_args()傳入?yún)?shù)咧织,為了能夠識(shí)別文件字符串钧忽,如"demo.txt",需要設(shè)置此值,如"@"缺菌,那么所有以此字符為開(kāi)頭的字符串都被當(dāng)作是文件蛋叼,所以傳給parse_args()的參數(shù)應(yīng)該是@demo.txt鸭栖。在該文件中镜粤,一行只能有一個(gè)參數(shù)。如文件中的'-f\nbar'會(huì)被解析成['-f','bar']
argument_default:一般情況下,默認(rèn)值使用add_argument()來(lái)添加,或者使用set_defaults()設(shè)置一些鍵值對(duì)來(lái)添加。剩下一種情況就是設(shè)置此項(xiàng)(此處沒(méi)看明白是咋回事)社痛。
conflict_handler:解決在add_argument()階段有沖突的option的依據(jù)策略见转,默認(rèn)為error即拋出異常。一般情況下遇到?jīng)_突是拋出異常即可斩箫,但是如果設(shè)置了parents撵儿,那么需要重寫(xiě)父parser中的規(guī)則的時(shí)候,就需要將此項(xiàng)設(shè)置為resolve,但是重寫(xiě)是精確匹配的花竞,如老規(guī)則定義了-h/--help,重寫(xiě)了-h厌蔽,那么--help還是老規(guī)則牵辣。
add_help:是否添加-h/--helpoption,默認(rèn)為T(mén)rue戴卜。為False時(shí)逾条,是要做parent(其實(shí)可以設(shè)置子Parser重寫(xiě))。默認(rèn)是-h/--help投剥,若prefix_chars中沒(méi)有包含'-'师脂,那么就以其中第一個(gè)字符作為代替。

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][,metavar][, dest])
name or flags:是位置參數(shù)江锨,則需要傳入名字吃警;要是可選參數(shù),則需要進(jìn)行定義泳桦,如'-f'汤徽,'--foo'娩缰。
action:定義傳入的參數(shù)如何處理灸撰。

  • action='store',默認(rèn)取值拼坎,保存?zhèn)魅雲(yún)?shù)浮毯。
  • action='store_const',需要添加const泰鸡,意味著該argument的值不從命令行輸入债蓝,而是取const的值。
  • action='store_true' or action='store_false'盛龄,'store_const'的特殊情形饰迹,意味著const的值為TrueFalse芳誓。
  • action='append',表示傳入的值會(huì)作為一個(gè)列表的一項(xiàng)啊鸭,意味著option可以在命令行中多次出現(xiàn)锹淌。
  • action='append_const',傳入列表的項(xiàng)由const定義赠制,通常用在需要多個(gè)argument將值傳入一個(gè)列表中的場(chǎng)景赂摆。
  • action='count',輸出argument出現(xiàn)的次數(shù)钟些。
  • action='help'烟号,已默認(rèn)添加。
  • action='version'政恍,需要定義version汪拥,使用時(shí)輸出版本信息并退出。
  • 自定義篙耗,通過(guò)定義一個(gè)argparse.Action子類來(lái)實(shí)現(xiàn)喷楣。實(shí)際上,上面的這些可選項(xiàng)都是通過(guò)這種形式定義的鹤树。

nargs:通常一個(gè)選項(xiàng)后跟一個(gè)參數(shù)铣焊,通過(guò)設(shè)置此項(xiàng)可以實(shí)現(xiàn)不同情況。

  • nargs=N罕伯,一個(gè)選項(xiàng)后可以跟多個(gè)參數(shù)(action='append'時(shí)曲伊,依然是一個(gè)選項(xiàng)后跟一個(gè)參數(shù),只不過(guò)選項(xiàng)可以多次出現(xiàn))追他,參數(shù)的個(gè)數(shù)必須為N的值坟募,這些參數(shù)會(huì)生成一個(gè)列表,當(dāng)nargs=1時(shí)邑狸,會(huì)生成一個(gè)長(zhǎng)度為1的列表懈糯。
  • nargs=?,如果沒(méi)有在命令行中出現(xiàn)對(duì)應(yīng)的項(xiàng)单雾,則給對(duì)應(yīng)的項(xiàng)賦值為default赚哗。特殊的是,對(duì)于可選項(xiàng)硅堆,如果命令行中出現(xiàn)了此可選項(xiàng)屿储,但是之后沒(méi)有跟隨賦值參數(shù),則此時(shí)給此可選項(xiàng)并不是賦值default的值渐逃,而是賦值const的值够掠。
  • nargs=*,和N類似茄菊,但是沒(méi)有規(guī)定列表長(zhǎng)度疯潭。
  • nargs=+赊堪,和*類似,但是給對(duì)應(yīng)的項(xiàng)當(dāng)沒(méi)有傳入?yún)?shù)時(shí)竖哩,會(huì)報(bào)錯(cuò)error: too few arguments雹食。
  • nargs=argparse.REMAINDER,所有剩余的參數(shù)期丰,均轉(zhuǎn)化為一個(gè)列表賦值給此項(xiàng)群叶,通常用此方法來(lái)將剩余的參數(shù)傳入另一個(gè)parser進(jìn)行解析。

如果nargs沒(méi)有定義钝荡,則可傳入?yún)?shù)的數(shù)量由action決定街立,通常情況下為一個(gè),并且不會(huì)生成長(zhǎng)度為一的列表埠通。
const赎离,一種是定義action='store_const'action='append_const'時(shí)使用。一種是定義nargs='?'時(shí)端辱,可選項(xiàng)出現(xiàn)在命令行中梁剔,但之后并沒(méi)有跟隨賦值的參數(shù),作為默認(rèn)值傳給此可選項(xiàng)舞蔽。
default:默認(rèn)值荣病。
如果是一個(gè)字符串,那么Parser解析的時(shí)候會(huì)將它作為命令行傳入值渗柿,使用type的值來(lái)進(jìn)行轉(zhuǎn)換類型个盆,但是如果不是的話,就會(huì)使用定義的值而不進(jìn)行類型轉(zhuǎn)換朵栖。
如果設(shè)置了nargs='?'nargs='*'颊亮,那么當(dāng)沒(méi)有參數(shù)賦值給該項(xiàng)時(shí),會(huì)使用default定義的值陨溅。
default=argparse.SUPPRESS時(shí)终惑,則表示命令行中未出現(xiàn)某一項(xiàng)時(shí),不會(huì)對(duì)它進(jìn)行默認(rèn)賦值门扇。
type:用于類型檢查和類型轉(zhuǎn)換雹有。
使用FileType可簡(jiǎn)化對(duì)文件的操作。
還可以自定義函數(shù)悯嗓,輸入是一個(gè)字符串件舵,輸出是轉(zhuǎn)換后的字符串卸察。
當(dāng)設(shè)置choices的時(shí)脯厨,類型檢查會(huì)變得容易,因?yàn)橹恍枰谝粋€(gè)范圍內(nèi)比較即可坑质。
choices:給定了取值范圍合武,超出會(huì)報(bào)錯(cuò)临梗。
當(dāng)type也有定義時(shí),會(huì)先使用type進(jìn)行類型檢查稼跳,所以choices中的取值必須符合type的定義盟庞,否則在parse_args()時(shí)會(huì)報(bào)錯(cuò)。
任何支持in操作符的均可作為choices的賦值汤善,所以字典什猖,列表,集合红淡,等等其他容器均都支持不狮。
required:默認(rèn)情況下,可選項(xiàng)(前面有'-')被認(rèn)為并不一定需要出現(xiàn)在命令行參數(shù)中在旱,但是如果設(shè)置了required=True的話摇零,則必須出現(xiàn)。此類設(shè)置違背人的常識(shí)桶蝎,應(yīng)避免使用驻仅。
help:幫助信息。
之前提到的%(prog)s可用于此處程序名的格式化登渣,此外噪服,還有%(default)s格式化default的值,%(type)s格式化type的值胜茧。
設(shè)置為argparse.SUPPRESS可不顯示幫助信息芯咧。
metavar:在Parser生成幫助信息時(shí),需要有字符代表需要傳入的值竹揍。(這一段和dest相同敬飒,使用的就是dest的值)如果是位置參數(shù),則用它本身代替芬位;如果是可選參數(shù)无拗,則使用它的大寫(xiě)來(lái)代替。使用metavar可替換默認(rèn)的字符昧碉。
dest:大部分的選項(xiàng)都需要通過(guò)命令行來(lái)給其賦值英染,這些值的名字通過(guò)dest來(lái)定義,默認(rèn)的規(guī)則如同metavar中所述被饿。

ArgumentParser.parse_args(args=None, namespace=None)
args轉(zhuǎn)換為namespace對(duì)象的一個(gè)值四康。默認(rèn)情況下,sys.argv賦值給args狭握,一個(gè)空的Namespace對(duì)象會(huì)被創(chuàng)建闪金。
解析時(shí),會(huì)對(duì)傳入的參數(shù)進(jìn)行檢查,若不符合要求就會(huì)報(bào)錯(cuò)哎垦。
一般情況下囱嫩,會(huì)自動(dòng)判斷傳入的值到底是一個(gè)可選參數(shù),還是一個(gè)負(fù)數(shù)(都用'-'開(kāi)頭)漏设。但有時(shí)位置參數(shù)的值必須是一個(gè)'-'開(kāi)頭的值墨闲,如'-f',那么使用parser.parse_args(['--', '-f'])郑口,'--'代表后續(xù)的所有傳入值都需要看做是位置參數(shù)鸳碧。
parse_args()會(huì)返回填充好的Namespace對(duì)象,若要將它變?yōu)樽值淙裕墒褂肞ython自帶的vars()杆兵。

vars(...)
    vars([object]) -> dictionary   
    Without arguments, equivalent to locals().
    With an argument, equivalent to object.__dict__.

也可不使用Namespace,而是傳入一個(gè)提前生成的對(duì)象仔夺。

其他
ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, help][, metavar])用來(lái)定義子Parser琐脏。
class argparse.FileType(mode='r', bufsize=None)用來(lái)給add_argument()中的type參數(shù)賦值。
ArgumentParser.add_argument_group(title=None, description=None)定義一個(gè)組缸兔。
ArgumentParser.add_mutually_exclusive_group(required=False)定義組中只能有一個(gè)選項(xiàng)出現(xiàn)日裙。
ArgumentParser.set_defaults(kwargs)設(shè)置默認(rèn)值。
ArgumentParser.get_default(dest)獲取默認(rèn)值惰蜜。
ArgumentParser.print_usage(file=None)
ArgumentParser.print_help(file=None)
ArgumentParser.format_usage()
ArgumentParser.format_help()以上四種都是幫助信息相關(guān)的昂拂。
ArgumentParser.parse_known_args(args=None, namespace=None)只解析知道的部分。
ArgumentParser.convert_arg_line_to_args(arg_line)
ArgumentParser.exit(status=0, message=None)
ArgumentParser.error(message)

docopt


理念是好的幫助信息應(yīng)該正好包含生成命令行解析器所需要的全部信息抛猖。

docopt.docopt(doc, argv=None, help=True, version=None, options_first=False)
doc參數(shù)可以是一個(gè)模塊的docstring(__doc__)格侯,或者是其他符合格式的幫助信息。
argv默認(rèn)情況下使用sys.argv[1:]财著,或者可以使用一個(gè)字符串联四。
help默認(rèn)為T(mén)rue,當(dāng)輸入-h--help后(需提前設(shè)置好)撑教,解析器能夠自動(dòng)生成對(duì)應(yīng)的幫助文本朝墩。需要手動(dòng)管理的可設(shè)置為False。
version版本信息伟姐,是可選參數(shù)收苏。
options_first默認(rèn)為False。當(dāng)設(shè)置為T(mén)rue時(shí)愤兵,不允許可選參數(shù)和位置參數(shù)進(jìn)行混合鹿霸,即在出現(xiàn)的第一個(gè)位置參數(shù)之后的所有參數(shù),均被當(dāng)作是位置參數(shù)秆乳,這是為了和POSIX保持兼容懦鼠。
返回值是一個(gè)字典,key是option,value就是對(duì)應(yīng)輸入的參數(shù)葛闷。

幫助信息格式分為兩部分憋槐,Usage patternOption descriptions双藕。只有符合格式的字符串才會(huì)被識(shí)別并解析淑趾,其余字符串會(huì)被忽略。
Usage pattern
舉例:

Usage: my_program.py [-hso FILE] [--quiet | --verbose] [INPUT ...]

Usage pattern是doc的子字符串忧陪。開(kāi)始于usage:(大小寫(xiě)不敏感)扣泊,結(jié)束于一行空行。
位于usage:之后的第一個(gè)單詞是程序的名字嘶摊,可以重復(fù)多次進(jìn)行不同pattern的定義延蟹。

"""
Usage: my_program.py FILE 
       my_program.py COUNT FILE
"""

每個(gè)pattern都由以下部分組成。
一個(gè)是<arguments>, ARGUMENTS格式的定義叶堆,要么是用尖括號(hào)包括阱飘,要么是大寫(xiě)。
還有一個(gè)是-options虱颗,必須要以“-”開(kāi)頭沥匈,可以堆棧好幾個(gè)option,如-oiv等價(jià)于-o -i -v忘渔。option是可以有參數(shù)的高帖,如-f FILE-f=FILE畦粮,-fFILE散址,都是等價(jià)的。其他一些選擇在下方的option descriptions中進(jìn)行具體定義宣赔。
最后一個(gè)是commands预麸,除了以上提及的兩種情況,剩下的格式儒将,再加上兩個(gè)特殊的命令:?jiǎn)蝹€(gè)的“-”和雙個(gè)的“-”师崎,這些都?xì)w屬于此。

commands中椅棺,[ ]表示可選犁罩。( )表示必須存在,所有沒(méi)有用[ ]包裹的字符串都默認(rèn)被( )包裹两疚。
|是管道符床估,若某一個(gè)選項(xiàng)必須存在,則將他們用( )包裹诱渤,如my_program.py(--clockwise | --counter-clockwise) TIME丐巫,若都是可選項(xiàng),則用[ ]包裹,如my_program.py[--left | --right]递胧。
...表示有一個(gè)或多個(gè)元素碑韵,如my_program.py FILE ...表示一個(gè)或多個(gè)FILE可接受,而my_program.py [FILE ...]表示0個(gè)或多個(gè)FILE可接受缎脾。
[options](大小寫(xiě)敏感)是任意options的縮寫(xiě)祝闻。可以使用它來(lái)定義該pattern可以使用任何在下方Option descriptions中定義的option遗菠。
[--]是為了分隔可選參數(shù)和位置參數(shù)联喘,如Usage: my_program [options] [--] <file>...,其中中括號(hào)可去除辙纬,變?yōu)楸靥铐?xiàng)豁遭。
[-]若出現(xiàn),則表示程序需要使用stdin贺拣,禁止使用file蓖谢。而單個(gè)的-則是一個(gè)普通字符。

如果在usage pattern中重復(fù)出現(xiàn)同名位置參數(shù)多次,或者同名有參數(shù)的可選參數(shù)多次,那么傳入的值會(huì)被解析成一個(gè)列表拇厢。如Usage: my_program.py <file> <file> --path=<path>...的結(jié)果會(huì)是args['<file>'] == ['file1', 'file2']以及args['--path'] == ['./here', './there']

Option descriptions
舉例:

-h --help    show this
-s --sorted  sorted output
-o FILE      specify output file [default: ./test.txt]
--quiet      print less text
--verbose    print more text

此部分位于usage pattern下方沟使,它可以有三方面作用:定義同義的短option和長(zhǎng)option;某個(gè)option是否需要傳入?yún)?shù)渊跋;某個(gè)option是否有默認(rèn)參數(shù)腊嗡。
規(guī)則如下:
每行定義一個(gè)option,必須以一個(gè)或兩個(gè)“-”開(kāi)頭拾酝。
為定義需要傳入的參數(shù)燕少,可以在對(duì)應(yīng)的option后方加上一個(gè)字符串,兩者以空格或“=”相隔蒿囤,兩者都是可行的客们,但推薦只使用一種風(fēng)格。

-o FILE --output=FILE       # without comma, with "=" sign
-i <file>, --input <file>   # with comma, wihtout "=" sign

使用兩個(gè)空格來(lái)將option本身與它的描述想分隔(按照示例應(yīng)該是至少兩個(gè)空格)材诽。

--verbose More text.   # BAD, will be treated as if verbose option had
                       # an argument "More", so use 2 spaces instead
-q        Quit.        # GOOD
-o FILE   Output file. # GOOD
--stdout  Use stdout.  # GOOD, 2 spaces

在option對(duì)應(yīng)的描述后方進(jìn)行默認(rèn)參數(shù)的設(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: ./]

若某option是可重復(fù)的脸侥,則默認(rèn)參數(shù)會(huì)以空格作為分割符進(jìn)行分割建邓,生成一個(gè)字符串列表。否則睁枕,作為一個(gè)字符串整體官边。

docopt不適用于大型多層次的命令行參數(shù)解析(例如git沸手,但是官方給出了一個(gè)example)。同時(shí)它沒(méi)有對(duì)數(shù)據(jù)的校驗(yàn)功能注簿,無(wú)法向用戶報(bào)錯(cuò)契吉。
使用try docopt可進(jìn)行docopt在線命令行參數(shù)解析。

舉例


例題是:知道創(chuàng)宇面試題诡渴。
使用argparse

import argparse
from argparse import ArgumentDefaultsHelpFormatter

parser = argparse.ArgumentParser(prog="Spider", description='Knownsec Interview Spider By Docopt.', formatter_class=ArgumentDefaultsHelpFormatter)

parser.add_argument('-u', dest='url', action='store', required=True, help='the url the spider begins with')
parser.add_argument('-d', dest='deep', action='store', required=True, type=int, help='the depth of spider')
parser.add_argument('-f', dest='logfile', action='store', default='spider.log', help='the name of logfile')
parser.add_argument('-l', dest='loglevel(1-5)', action='store', type=int, choices=range(1,6), default=1, help='the details level of the log, range 1 to 5')
parser.add_argument('--testself', dest='testself', action='store_true', help='the self test by this program')
parser.add_argument('--thread', dest='thread_number', action='store', type=int, default=10, help="the thread pool's capacity")
parser.add_argument('--dbfile', dest='dbfile_filepath', action='store', required=True, help='the sqlite3 file path')
parser.add_argument('--key', dest='keyword', action='store', help='the keyword to search in webpage')


print parser.parse_args()

輸出:

python argparse_demo.py -u 123.com -d 1 --dbfile 123.txt -f logfile -l 1 --testself --thread 2 
Namespace(dbfile_filepath='123.txt', deep=1, keyword=None, logfile='logfile', loglevel(1-5)=1, testself=True, thread_number=2, url='123.com')

體會(huì)就是功能很強(qiáng)大捐晶,實(shí)現(xiàn)很方便。所以我傾向于使用它玩徊。

使用docopt

"""
Knownsec Interview Spider By Docopt.

Usage:
  docopt_demo.py -u <url> -d <deep> [-f <logfile>] [-l <loglevel>] [--testself] [--thread <number>] --dbfile <filepath>  [--key=<keyword>]
  docopt_demo.py -h | --help
  docopt_demo.py --version

Options:
  -h --help               Show this screen.
  --version               Show version.
  -u <url>                the url the spider begins with
  -d <deep>               the depth of spider
  -f <logfile>            the name of logfile [default: spider.log]
  -l <loglevel>           the details level of the log, range 1 to 5 [default: 1]
  --testself              the self test by this program
  --thread <number>       the thread pool's capacity [default: 10]
  --dbfile <filepath>     the sqlite3 file path
  --key=<keyword>         the keyword to search in webpage

"""
from docopt import docopt

if __name__ == '__main__':
    arguments = docopt(__doc__, version='Spider 1.0')
    print arguments

輸出:

python docopt_demo.py  -u 123.com -d 1 --dbfile 123.txt -f logfile -l 1 --testself --thread 2 

{'--dbfile': '123.txt',
 '--help': False,
 '--key': None,
 '--testself': True,
 '--thread': '2',
 '--version': False,
 '-d': '1',
 '-f': 'logfile',
 '-l': '1',
 '-u': '123.com'}

可見(jiàn)租悄,如果選項(xiàng)不需要參數(shù)谨究,則-h和--version這種沒(méi)有設(shè)置的會(huì)賦值為False恩袱,而--testself會(huì)賦值為T(mén)rue;對(duì)于需要參數(shù)的選項(xiàng)胶哲,如果沒(méi)有設(shè)置畔塔,如--key,會(huì)被賦值為None鸯屿,而有設(shè)置并且給出參數(shù)的澈吨,會(huì)賦值對(duì)應(yīng)的參數(shù),如--dbfile寄摆。
那么谅辣,對(duì)于有設(shè)置但是沒(méi)有給出參數(shù)的呢,并不會(huì)拋出異常報(bào)錯(cuò)婶恼,而是把Usage部分(有時(shí)加上Options部分)輸出桑阶,真是太不友好了,debug的時(shí)候真是坑爹啊勾邦。

另外蚣录,使用docopt時(shí)候需要注意__doc__的用法,如果是寫(xiě)函數(shù)的__doc__眷篇,則在函數(shù)名之下開(kāi)始寫(xiě)萎河,而一個(gè)模塊的則必須在開(kāi)頭寫(xiě),也就是在import之前寫(xiě)蕉饼,否則__doc__ == None虐杯。


20161226
今天了解了一個(gè)很方便的庫(kù):click,作為補(bǔ)充昧港。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末擎椰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慨飘,更是在濱河造成了極大的恐慌确憨,老刑警劉巖译荞,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異休弃,居然都是意外死亡吞歼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)塔猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)篙骡,“玉大人,你說(shuō)我怎么就攤上這事丈甸∨此祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵睦擂,是天一觀的道長(zhǎng)得湘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)顿仇,這世上最難降的妖魔是什么淘正? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮臼闻,結(jié)果婚禮上鸿吆,老公的妹妹穿的比我還像新娘。我一直安慰自己述呐,他們只是感情好惩淳,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著乓搬,像睡著了一般思犁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缤谎,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天抒倚,我揣著相機(jī)與錄音,去河邊找鬼坷澡。 笑死托呕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的频敛。 我是一名探鬼主播项郊,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斟赚!你這毒婦竟也來(lái)了着降?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拗军,失蹤者是張志新(化名)和其女友劉穎任洞,沒(méi)想到半個(gè)月后蓄喇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡交掏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年妆偏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盅弛。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钱骂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挪鹏,到底是詐尸還是另有隱情见秽,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布讨盒,位于F島的核電站解取,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏催植。R本人自食惡果不足惜肮蛹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一勺择、第九天 我趴在偏房一處隱蔽的房頂上張望创南。 院中可真熱鬧,春花似錦省核、人聲如沸稿辙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邻储。三九已至,卻和暖如春旧噪,著一層夾襖步出監(jiān)牢的瞬間吨娜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工淘钟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宦赠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓米母,卻偏偏與公主長(zhǎng)得像勾扭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铁瞒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容