日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python模块: 命令行解析optionparser

發(fā)布時(shí)間:2023/12/18 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python模块: 命令行解析optionparser 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python 有兩個(gè)內(nèi)建的模塊用于處理命令行參數(shù):
一個(gè)是 getopt,《Deep in python》一書中也有提到,只能簡(jiǎn)單處理 命令行參數(shù);
另一個(gè)是 optparse,它功能強(qiáng)大,而且易于使用,可以方便地生成標(biāo)準(zhǔn)的、符合Unix/Posix 規(guī)范的命令行說明。

使用optionparser模塊來解析

optionparser的執(zhí)行過程:

導(dǎo)入optionparser :?from?optparse?import?OptionParser
構(gòu)造optionparser的對(duì)象:parser?=?OptionParser()
往optionparser對(duì)象中增加option :parser.add_option()

調(diào)用optionparser的解析函數(shù):(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. 只需要參數(shù),不需要參數(shù)內(nèi)容的格式(-a --bb ...)

?

parser.add_option('--nl', action="store_false", help="No Need.")

?

3. 直接調(diào)用方法的格式,不需要參數(shù)內(nèi)容

?

parser.add_option("-l", "--list", action="callback", callback=test_list, help="check the list.")

?

4. 直接調(diào)用方法,并傳參數(shù)的格式

?

parser.add_option("-u", "--upload", action="callback", callback=test_upload, callback_args=(ingredient,build), help="upload result.")

?

?

?

?

?

?

示例

下面是一個(gè)使用 optparse 的簡(jiǎn)單示例:

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()??
  • ?

    現(xiàn)在,妳就可以在命令行下輸入:

    Python代碼?
  • <yourscript>?--file=outfile?-q??
  • <yourscript>?-f?outfile?--quiet??
  • <yourscript>?--quiet?--file?outfile??
  • <yourscript>?-q?-foutfile??
  • <yourscript>?-qfoutfile??
  • ?

    上面這些命令是相同效果的。除此之外, optparse 還為我們自動(dòng)生成命令行的幫助信息:

    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??
  • ?

    ?

    簡(jiǎn)單流程

    首先,必須 import OptionParser 類,創(chuàng)建一個(gè) OptionParser 對(duì)象:

    Python代碼?
  • from?optparse?import?OptionParser??
  • ??
  • [...]??
  • ??
  • parser?=?OptionParser()??
  • ?

    然后,使用 add_option 來定義命令行參數(shù):

    Python代碼?
  • parser.add_option(opt_str,?...,??
  • ??
  • ??????????????????attr=value,?...)??
  • ?

    每個(gè)命令行參數(shù)就是由參數(shù)名字符串和參數(shù)屬性組成的。如?-f?或者?–file?分別是長短參數(shù)名:

    Python代碼?
  • parser.add_option("-f",?"--file",?...)??
  • ?

    最后,一旦你已經(jīng)定義好了所有的命令行參數(shù),調(diào)用 parse_args() 來解析程序的命令行:

    Python代碼?
  • (options,?args)?=?parser.parse_args()??
  • ?

    注:?你也可以傳遞一個(gè)命令行參數(shù)列表到 parse_args();否則,默認(rèn)使用 sys.argv[:1]。

    parse_args() 返回的兩個(gè)值:

    • options,它是一個(gè)對(duì)象(optpars.Values),保存有命令行參數(shù)值。只要知道命令行參數(shù)名,如 file,就可以訪問其對(duì)應(yīng)的值: options.file 。
    • args,它是一個(gè)由 positional arguments 組成的列表。

    Actions

    action 是 parse_args() 方法的參數(shù)之一,它指示 optparse 當(dāng)解析到一個(gè)命令行參數(shù)時(shí)該如何處理。actions 有一組固定的值可供選擇,默認(rèn)是’store?‘,表示將命令行參數(shù)值保存在 options 對(duì)象里。

    示例

    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??
  • ?

    最后將會(huì)打印出 “foo.txt”。

    當(dāng) optparse 解析到’-f’,會(huì)繼續(xù)解析后面的’foo.txt’,然后將’foo.txt’保存到 options.filename 里。當(dāng)調(diào)用 parser.args() 后,options.filename 的值就為’foo.txt’。

    你也可以指定 add_option() 方法中 type 參數(shù)為其它值,如 int 或者 float 等等:

    Python代碼?
  • parser.add_option("-n",?type="int",?dest="num")??
  • ?

    默認(rèn)地,type 為’string’。也正如上面所示,長參數(shù)名也是可選的。其實(shí),dest 參數(shù)也是可選的。如果沒有指定 dest 參數(shù),將用命令行的參數(shù)名來對(duì) options 對(duì)象的值進(jìn)行存取。

    store 也有其它的兩種形式:?store_true?和?store_false?,用于處理帶命令行參數(shù)后面不 帶值的情況。如 -v,-q 等命令行參數(shù):

    Python代碼?
  • parser.add_option("-v",?action="store_true",?dest="verbose")??
  • parser.add_option("-q",?action="store_false",?dest="verbose")??
  • ?

    這樣的話,當(dāng)解析到 ‘-v’,options.verbose 將被賦予 True 值,反之,解析到 ‘-q’,會(huì)被賦予 False 值。

    其它的 actions 值還有:

    store_const?、append?、count?、callback?。

    ?

    默認(rèn)值

    parse_args() 方法提供了一個(gè) default 參數(shù)用于設(shè)置默認(rèn)值。如:

    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 另一個(gè)方便的功能是自動(dòng)生成程序的幫助信息。你只需要為 add_option() 方法的 help 參數(shù)指定幫助信息文本:

    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]")??
  • ?

    當(dāng) optparse 解析到 -h 或者 –help 命令行參數(shù)時(shí),會(huì)調(diào)用 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 將會(huì)退出,不再解析其它的命令行參數(shù)。

    以上面的例子來一步步解釋如何生成幫助信息:

    • 自定義的程序使用方法信息(usage message):

      Python代碼?
    • usage?=?"usage:?%prog?[options]?arg1?arg2"??
    • ?

      這行信息會(huì)優(yōu)先打印在程序的選項(xiàng)信息前。當(dāng)中的 %prog,optparse 會(huì)以當(dāng)前程序名的字符串來替代:如 os.path.basename.(sys.argv[0])。

      如果用戶沒有提供自定義的使用方法信息,optparse 會(huì)默認(rèn)使用: “usage: %prog [options]”。

    • 用戶在定義命令行參數(shù)的幫助信息時(shí),不用擔(dān)心換行帶來的問題,optparse 會(huì)處理好這一切。

    • 設(shè)置 add_option 方法中的 metavar 參數(shù),有助于提醒用戶,該命令行參數(shù)所期待的參數(shù),如 metavar=“mode”:

      Python代碼?
    • -m?MODE,?--mode=MODE??
    • ?

      注意:?metavar 參數(shù)中的字符串會(huì)自動(dòng)變?yōu)榇髮憽?/span>

    • 在 help 參數(shù)的幫助信息里使用 �fault 可以插入該命令行參數(shù)的默認(rèn)值。

    如果程序有很多的命令行參數(shù),你可能想為他們進(jìn)行分組,這時(shí)可以使用 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)??
  • ?

    下面是將會(huì)打印出來的幫助信息:

    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 一樣,你可以在創(chuàng)建 OptionParser 對(duì)象時(shí),指定其 version 參數(shù),用于顯示當(dāng)前程序的版本信息:

    Python代碼?
  • parser?=?OptionParser(usage="%prog?[-f]?[-q]",?version="%prog?1.0")??
  • ?

    這樣,optparse 就會(huì)自動(dòng)解釋 –version 命令行參數(shù):

    Python代碼?
  • $?/usr/bin/foo?--version??
  • foo?1.0??
  • ?

    ?

    處理異常

    包括程序異常和用戶異常。這里主要討論的是用戶異常,是指因用戶輸入無效的、不完整的命令行參數(shù)而引發(fā)的異常。optparse 可以自動(dòng)探測(cè)并處理一些用戶異常:

    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")??
  • ?

    上面的例子,當(dāng) -b 和 -b 命令行參數(shù)同時(shí)存在時(shí),會(huì)打印出“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()
  • 轉(zhuǎn)載于:https://www.cnblogs.com/WayneZeng/p/9290746.html

    總結(jié)

    以上是生活随笔為你收集整理的Python模块: 命令行解析optionparser的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。