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字符段之間。
epilog
:optional 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/--help
option,默認(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
的值為True
或False
芳誓。 -
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 pattern
和Option 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ǔ)充昧港。