Python 有兩個內建的模塊用于處理命令行參數:
一個是 getopt,《Deep in python》一書中也有提到,只能簡單處理 命令行參數;
另一個是 optparse,它功能強大,而且易于使用,可以方便地生成標準的、符合Unix/Posix 規范的命令行說明。
使用optionparser模塊來解析
optionparser的執行過程:
導入optionparser :?from?optparse?import?OptionParser
構造optionparser的對象:parser?=?OptionParser()
往optionparser對象中增加option :parser.add_option()
調用optionparser的解析函數:(options,?args)?=?parser.parse_args()
在options中使用解析到的options,在args中使用其他的args。
?
?
?
1. 普通的格式(-a a -b b ...)
1 #parse command
2 usage =
"usage: python %prog [options]"
3 parser = OptionParser(usage=
usage)
4 parser.add_option(
'-d',
'--device', help=
"Device serial number.")
5 parser.add_option(
'-o',
'--osVersion', help=
"Os version.")
6 options, args =
parser.parse_args(sys.argv)
7
8 if options.device
is None:
9 ......
10 else:
11 ......
12
13 if options.osVersion
is None:
14 osVersion =
......
15 elif options.osVersion
is "1":
16 osVersion =
......
17 else:
18 print "Error"
19 sys.exit(-1)
2. 只需要參數,不需要參數內容的格式(-a --bb ...)
?
parser.add_option(
'--nl', action=
"store_false", help=
"No Need.")
?
3. 直接調用方法的格式,不需要參數內容
?
parser.add_option(
"-l",
"--list", action=
"callback", callback=test_list, help=
"check the list.")
?
4. 直接調用方法,并傳參數的格式
?
parser.add_option(
"-u",
"--upload", action=
"callback", callback=test_upload, callback_args=(ingredient,build), help=
"upload result.")
?
?
?
?
?
?
示例
下面是一個使用 optparse 的簡單示例:
Python代碼? from?optparse?import?OptionParser??[...]??parser?=?OptionParser()??parser.add_option("-f",?"--file",?dest="filename",????????????????????help="write?report?to?FILE",?metavar="FILE")??parser.add_option("-q",?"--quiet",????????????????????action="store_false",?dest="verbose",?default=True,????????????????????help="don't?print?status?messages?to?stdout")????(options,?args)?=?parser.parse_args()?? ? 現在,妳就可以在命令行下輸入:
Python代碼?
<yourscript>?--file=outfile?-q??<yourscript>?-f?outfile?--quiet??<yourscript>?--quiet?--file?outfile??<yourscript>?-q?-foutfile??<yourscript>?-qfoutfile?? ?
上面這些命令是相同效果的。除此之外, optparse 還為我們自動生成命令行的幫助信息:
Python代碼?
<yourscript>?-h??<yourscript>?--help?? ?
輸出:
Python代碼?
usage:?<yourscript>?[options]????options:????-h,?--help????????????show?this?help?message?and?exit????-f?FILE,?--file=FILE??write?report?to?FILE????-q,?--quiet???????????don't?print?status?messages?to?stdout?? ?
?
簡單流程
首先,必須 import OptionParser 類,創建一個 OptionParser 對象:
Python代碼? from?optparse?import?OptionParser????[...]????parser?=?OptionParser()?? ? 然后,使用 add_option 來定義命令行參數:
Python代碼?
parser.add_option(opt_str,?...,??????????????????????attr=value,?...)?? ?
每個命令行參數就是由參數名字符串和參數屬性組成的。如?-f?或者?–file?分別是長短參數名:
Python代碼?
parser.add_option("-f",?"--file",?...)?? ?
最后,一旦你已經定義好了所有的命令行參數,調用 parse_args() 來解析程序的命令行:
Python代碼?
(options,?args)?=?parser.parse_args()?? ?
注:?你也可以傳遞一個命令行參數列表到 parse_args();否則,默認使用 sys.argv[:1]。
parse_args() 返回的兩個值:
- options,它是一個對象(optpars.Values),保存有命令行參數值。只要知道命令行參數名,如 file,就可以訪問其對應的值: options.file 。
- args,它是一個由 positional arguments 組成的列表。
Actions
action 是 parse_args() 方法的參數之一,它指示 optparse 當解析到一個命令行參數時該如何處理。actions 有一組固定的值可供選擇,默認是’store?‘,表示將命令行參數值保存在 options 對象里。
示例
Python代碼? parser.add_option("-f",?"--file",????????????????????action="store",?type="string",?dest="filename")??args?=?["-f",?"foo.txt"]??(options,?args)?=?parser.parse_args(args)??print?options.filename?? ? 最后將會打印出 “foo.txt”。
當 optparse 解析到’-f’,會繼續解析后面的’foo.txt’,然后將’foo.txt’保存到 options.filename 里。當調用 parser.args() 后,options.filename 的值就為’foo.txt’。
你也可以指定 add_option() 方法中 type 參數為其它值,如 int 或者 float 等等:
Python代碼?
parser.add_option("-n",?type="int",?dest="num")?? ?
默認地,type 為’string’。也正如上面所示,長參數名也是可選的。其實,dest 參數也是可選的。如果沒有指定 dest 參數,將用命令行的參數名來對 options 對象的值進行存取。
store 也有其它的兩種形式:?store_true?和?store_false?,用于處理帶命令行參數后面不 帶值的情況。如 -v,-q 等命令行參數:
Python代碼?
parser.add_option("-v",?action="store_true",?dest="verbose")??parser.add_option("-q",?action="store_false",?dest="verbose")?? ?
這樣的話,當解析到 ‘-v’,options.verbose 將被賦予 True 值,反之,解析到 ‘-q’,會被賦予 False 值。
其它的 actions 值還有:
store_const?、append?、count?、callback?。
?
默認值
parse_args() 方法提供了一個 default 參數用于設置默認值。如:
Python代碼? parser.add_option("-f","--file",?action="store",?dest="filename",?default="foo.txt")??parser.add_option("-v",?action="store_true",?dest="verbose",?default=True)?? ? 又或者使用 set_defaults():
Python代碼?
parser.set_defaults(filename="foo.txt",verbose=True)??parser.add_option(...)??(options,?args)?=?parser.parse_args()?? ?
?
生成程序幫助
optparse 另一個方便的功能是自動生成程序的幫助信息。你只需要為 add_option() 方法的 help 參數指定幫助信息文本:
Python代碼? usage?=?"usage:?%prog?[options]?arg1?arg2"??parser?=?OptionParser(usage=usage)??parser.add_option("-v",?"--verbose",????????????????????action="store_true",?dest="verbose",?default=True,????????????????????help="make?lots?of?noise?[default]")??parser.add_option("-q",?"--quiet",????????????????????action="store_false",?dest="verbose",????????????????????help="be?vewwy?quiet?(I'm?hunting?wabbits)")??parser.add_option("-f",?"--filename",????????????????????metavar="FILE",?help="write?output?to?FILE"),??parser.add_option("-m",?"--mode",????????????????????default="intermediate",????????????????help="interaction?mode:?novice,?intermediate,?"?????????????????????"or?expert?[default:?�fault]")?? ? 當 optparse 解析到 -h 或者 –help 命令行參數時,會調用 parser.print_help() 打印程序的幫助信息:
Python代碼?
usage:?<yourscript>?[options]?arg1?arg2????options:????-h,?--help????????????show?this?help?message?and?exit????-v,?--verbose?????????make?lots?of?noise?[default]????-q,?--quiet???????????be?vewwy?quiet?(I'm?hunting?wabbits)????-f?FILE,?--filename=FILE??????????????????????????write?output?to?FILE????-m?MODE,?--mode=MODE??interaction?mode:?novice,?intermediate,?or??????????????????????????expert?[default:?intermediate]?? ?
注意:?打印出幫助信息后,optparse 將會退出,不再解析其它的命令行參數。
以上面的例子來一步步解釋如何生成幫助信息:
-
自定義的程序使用方法信息(usage message):
Python代碼? - usage?=?"usage:?%prog?[options]?arg1?arg2"??
? 這行信息會優先打印在程序的選項信息前。當中的 %prog,optparse 會以當前程序名的字符串來替代:如 os.path.basename.(sys.argv[0])。
如果用戶沒有提供自定義的使用方法信息,optparse 會默認使用: “usage: %prog [options]”。
-
用戶在定義命令行參數的幫助信息時,不用擔心換行帶來的問題,optparse 會處理好這一切。
-
設置 add_option 方法中的 metavar 參數,有助于提醒用戶,該命令行參數所期待的參數,如 metavar=“mode”:
Python代碼? - -m?MODE,?--mode=MODE??
? 注意:?metavar 參數中的字符串會自動變為大寫。
-
在 help 參數的幫助信息里使用 �fault 可以插入該命令行參數的默認值。
如果程序有很多的命令行參數,你可能想為他們進行分組,這時可以使用 OptonGroup:
Python代碼?
group?=?OptionGroup(parser,?``Dangerous?Options'',??????????????????????``Caution:?use?these?options?at?your?own?risk.??``??????????????????????``It?is?believed?that?some?of?them?bite.'')??group.add_option(``-g'',?action=''store_true'',?help=''Group?option.'')??parser.add_option_group(group)?? ?
下面是將會打印出來的幫助信息:
Python代碼?
usage:??[options]?arg1?arg2????options:????-h,?--help???????????show?this?help?message?and?exit????-v,?--verbose????????make?lots?of?noise?[default]????-q,?--quiet??????????be?vewwy?quiet?(I'm?hunting?wabbits)????-fFILE,?--file=FILE??write?output?to?FILE????-mMODE,?--mode=MODE??interaction?mode:?one?of?'novice',?'intermediate'?????????????????????????[default],?'expert'??????Dangerous?Options:??????Caution:?use?of?these?options?is?at?your?own?risk.??It?is?believed?that??????some?of?them?bite.??????-g?????????????????Group?option.?? ?
?
顯示程序版本
象 usage message 一樣,你可以在創建 OptionParser 對象時,指定其 version 參數,用于顯示當前程序的版本信息:
Python代碼? parser?=?OptionParser(usage="%prog?[-f]?[-q]",?version="%prog?1.0")?? ? 這樣,optparse 就會自動解釋 –version 命令行參數:
Python代碼?
$?/usr/bin/foo?--version??foo?1.0?? ?
?
處理異常
包括程序異常和用戶異常。這里主要討論的是用戶異常,是指因用戶輸入無效的、不完整的命令行參數而引發的異常。optparse 可以自動探測并處理一些用戶異常:
Python代碼? $?/usr/bin/foo?-n?4x??usage:?foo?[options]????foo:?error:?option?-n:?invalid?integer?value:?'4x'????$?/usr/bin/foo?-n??usage:?foo?[options]????foo:?error:?-n?option?requires?an?argument?? ? 用戶也可以使用 parser.error() 方法來自定義部分異常的處理:
Python代碼?
(options,?args)?=?parser.parse_args()??[...]??if?options.a?and?options.b:??????parser.error("options?-a?and?-b?are?mutually?exclusive")?? ?
上面的例子,當 -b 和 -b 命令行參數同時存在時,會打印出“options -a and -b are mutually exclusive“,以警告用戶。
如果以上的異常處理方法還不能滿足要求,你可能需要繼承 OptionParser 類,并重載 exit() 和 erro() 方法。
?
完整的程序例子
Python代碼? from?optparse?import?OptionParser??[...]??def?main():??????usage?=?"usage:?%prog?[options]?arg"??????parser?=?OptionParser(usage)??????parser.add_option("-f",?"--file",?dest="filename",????????????????????????help="read?data?from?FILENAME")??????parser.add_option("-v",?"--verbose",????????????????????????action="store_true",?dest="verbose")??????parser.add_option("-q",?"--quiet",????????????????????????action="store_false",?dest="verbose")??????[...]??????(options,?args)?=?parser.parse_args()??????if?len(args)?!=?1:??????????parser.error("incorrect?number?of?arguments")??????if?options.verbose:??????????print?"reading?%s..."?%?options.filename??????[...]????if?__name__?==?"__main__":??????main()
轉載于:https://www.cnblogs.com/WayneZeng/p/9290746.html
總結
以上是生活随笔為你收集整理的Python模块: 命令行解析optionparser的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。