15、Optparse模塊

optparse模塊

Python提供了內置模塊optparse來處理命令行選項;該模塊提供了比getopt模塊更強大的處理功能;比如,它可以指定命令行選項的參數值的數據類型,可以自動生成命令行選項的幫助信息;該模塊很提供了很多方法來修改或定製命令行選項的屬性特徵;

備註:optparse模塊處理的長選項,需要附加參數值時,既可以使用等號"="來附加參數的值,也可以使用空格" "來附加參數的值;若使用等號"="來附加參數的值,則等號"="前後不能有空格;例如,下面的命令行選項的輸入格式都正確:

--file=filename1、--file filename1;

解析器:

模塊optparse使用類OptionParser來作為命令行選項的解析器;下面是該類的方法:

1、optparse.OptionParser(self, prog=None, usage=None, description=None, epilog=None, option_list=None, option_class=<class>, version=None, conflict_handler='error', formatter=None, add_help_option=True):/<class>

構造函數__init__(),用於創建一個命令行選項解析器實例;其中,參數:

(1).prog:當前腳本程序的名稱;os.path.basename(sys.argv[0]);

(2).usage:描述當前腳本程序的用法字符串;顯示該用法之前,格式"%prog"將被格式化成當前腳本程序的名稱;

(3).description:當前腳本程序的簡單描述、摘要、大綱;它會被顯示在命令行選項的幫助之前;

(4).epilog:當前腳本程序的簡單描述、摘要、大綱;它會被它會被顯示在命令行選項的幫助之後;

(5).conflict_handler:命令行選項衝突處理器;比如,當命令行選項重複時,該如何讓處理;可選值:error、resolve;

(6).add_help_option:是否自動生成幫助信息;True:是; False:否; 默認值是True;

(7).option_list:當前腳本程序的命令行選項列表;這個選項列表在standard_options_list中選項添加之後,但是在版本和幫助選項添加之前;可以手工創建該列表,該列表中的元素都使用函數make_option()生成;

例如:option_list=[make_option("-f","--file",action="store",type="string",dest="filename"), ...];

(8).option_class:在使用函數add_option()添加命令行選項到解析器時使用的類;默認為optparse.Option類;

(9).version:打印版本的信息;

(10).formatter:幫助信息格式;有兩種格式:IndentedHelpFormatter和TitledHelpFormatter;其中,參數prog在usage和version中使用格式字符串"%prog"代替os.path.basename(sys.argv[0]);

2、optparse.OptionParser.add_option(self, args, *kwargs):

該函數用於添加命令行選項;參數*args用於傳遞一個命令行選項的列表;**kwargs用於傳遞該命令行選項的屬性;有幾種用法:

(1).parser.add_option(self, optparse.Option):直接添加一個命令行選項類的實例;

(2).parser.add_option(self, option_list):直接添加一個命令行選項列表;option_list=[make_option(), ...];

(3).parser.add_option(*opt_str, ..., kwarg=val, ...);

常用的是第三種;這種用法的函數原型如下:

optparse.OptionParser.add_option(short_option[, long_option], action="store", type="store", dest=None, nargs=1, default=None, help="help text", metavar="");其中,參數:

(1).short_option:短選項字符串;例如,"-f"、"-X";

(2).long_option:長選項字符串;例如,"--file"、"--start";長選項和短選項共同構成可選參數*args或*opt_str;

(3).action:行為字符串;它指示optparse當解析到一個命令行選項時該如何處理;可選值store、store_true、store_false、store_const、append、append_const、count、callback、help、version;默認值是store,表示把 命令行參數保存到options對象中;

(4).type:當action的值為存儲方式時,type表示存儲的數據的類型;有string、int、long、float、complex、choice;

(5).dest:當action的值為存儲方式時,dest表示用於存儲數據(當前命令行選項附加的參數值)的變量,它會成為函數parse_args()返回的options對象的屬性,通過"對象名.屬性名"的方式引用;如果不指定dest參數的值,則使用當前命令行選項的長選項名作為dest參數的缺省值和options對象的屬性,來存儲當前命令行選項的附加參數值;如果當前命令行選項沒有指定長選項,則使用短選項名作為dest參數的缺省值和options對象的屬性,來存儲當前命令行選項的附加參數值;

(6).nargs:指定當前命令行選項應該需要接受的附加參數值的個數;默認值為1;多個參數值之間用空格隔開;當在命令行為該選項輸入的附加參數值的個數多於nargs指定的個數時,則值取用前面的nargs個;當在命令行上為該選項輸入的附加參數值的個數少於nargs所指定的個數時,則會報錯;如果nargs>1,則Python解釋器會把這nargs個參數值組裝成一個元組(tuple),然後把這個元組傳遞給當前程序使用;

(7).default:當action的值為存儲方式時,default用於指定dest表示的屬性變量的缺省值,即,當前命令行選項附加的參數的缺省值;

(8).help:當前命令行選項的幫助、說明信息;

(9).metavar:佔位字符串;用於在輸出幫助信息時,代替當前命令行選項的附加參數的值進行輸出;例如:"-f FILE --file FILE";這個例子中,字符串"FILE"就是metavar的值;

例如:add_oprion("-f", "--file", action="store", type="string", dest="fileName", default="file.txt", help="save host info", metavar="FILE");

當調用parse_args()函數之後,會返回一個options對象,dest參數的值"fileName"將作為options對象的屬性名使用,即:options.fileName;同時把當前命令行選項的附加參數值保存在該屬性中,即:options.fileName="file.txt";備註:函數add_option()的各個參數其實就對應著類optparse.Option的對象的每一個屬性;

3、(options,args) = optparse.OptionParser.parse_args(self, args=None, values=None):該函數用於解析命令行參數;其中,參數:

(1).args:用於傳遞需要被解析的命令行選項列表;默認是sys.argv[1:];

(2).values:用於傳遞命令行選項的附加參數值的對象;是optparse.Values類的對象;返回值:是一個包含(options,args)對的tuple;

(1).options:與傳遞的options或者optparse對象相同,通過optparse創建的實例值;

(2).args:所有被處理的參數之後的剩餘參數;

4、optparse.OptionParser.has_option(self, opt_str):該函數用於判斷OptionParser實例是否有一個名為opt_str的命令行選項;返回值:True-有; False-無;

5、optparse.OptionParser.get_option(self, opt_str):該函數用於獲取命令行選項opt_str的實例;若沒有該選項,則返回None;

6、optparse.OptionParser.remove_option(self, opt_str):該函數用於移除命令行選項opt_str;若OptionParser對象中存在命令行選項opt_str,則移除,否則拋出ValueError異常;若存在多個opt_str的選項,則所有相關的選項都變成無效;

7、optparse.OptionParser.destroy():該函數用於銷燬OptionParser對象實例;

選項行為

action的取值:

store:表示把命令行參數值保存到options對象中,即,保存到dest參數值代表的變量中;

store_true:用於處理命令行選項不帶附加參數值的情況,該選項類似於一個開關,保存真值True;

store_false:用於處理命令行選項不帶附加參數值的情況,該選項類似於一個開關,保存假值False;

store_const:保存一個常量值到dest參數值代表的變量中,常量值由const參數指定;

append:保存/追加這個選項的參數到一個列表中;

append_const:保存/追加這個選項的參數到一個列表中,常量值由const參數指定;

count:把一個計數器遞增1;

callback:調用一個指定的函數;

衝突處理

當設定的命令行選項衝突時,用於處理該衝突的一種機制;比如:不小心把兩個或多個命令行選項設置成相同的導致衝突的選項字符串;比如:

parser.add_option("-n", "--dry-run", ...);

parser.add_option("-n", "--noisy", ...);

指定衝突處理器的方法:

1、在OptionParser的構造函數中通過參數指定:OptionParser(conflict_handler=handler);

2、通過調用OptionParser對象的set_conflict_handler()指定:OptionParser.set_conflict_handler(handler);

可用的衝突處理器有:error和resolve;默認是error;

erro:衝突時觸發異常OptionConflictError;

resolve:衝突時智能解決;

選項屬性

optparse.Option類的屬性如下:

Option.action:定義命令行選項的行為;缺省值"store";

Option.type:定義選命令行項附加參數的類型;缺省值"string";

Option.dest:定義一個變量名稱,用於保存命令行選項附加參數的值;該變量會變成options對象的屬性;

Option.default:定義命令行選項附加參數值的缺省值;

Option.nargs:一個單一的命令行選項所附加的參數值的個數;

Option.const:作為action屬性的值,用於指定保存的數據為常量;

Option.choices:作為type屬性的值,用於指定從字符串列表中選擇一個類型;

Option.callback:作為action的屬性值,用於指定命令行選項的參數是一個可調用的對象或函數; <<<

Option.callback_args:以元組結構為Option.callback屬性所指定的可調用對象或函數傳遞可選參數;(*args)

Option.callback_kwargs:以字典結構為Option.callback屬性所指定的可調用對象或函數傳遞可選參數;{key:val}

Option.help:幫助文本;such as --help/-h;若要隱藏該選項,可使用值optparse.SUPPRESS_HELP;

Option.metavar:命令行選項的附加參數值的佔位符;用於打印幫助信息時,替代命令行選項的附加參數值進行輸出;

示例

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# @Time : 2018/5/5 12:13

# @Author : CaiChangEn

# @Email : [email protected]

# @Software: PyCharm

import argparse

parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]',description="ex\\r\\ntest")

parser.add_argument('-s','--server', dest='server', type=str,default='127.0.0.1',

help='可選參數,服務端IP地址,默認值是127.0.0.1')

parser.add_argument('-P','--port', dest='port', type=int,default=8080,

help='可選參數,服務器端端口,默認值是8080')

parser.add_argument('-u','--user', dest='user', type=str,default='none',

help='可選參數,用戶帳號,默認為none')

parser.add_argument('-p','--password', dest='password', type=str,default='none',

help='可選參數,用戶密碼,默認為none')

parser.add_argument('cce', metavar='cce', type=str,default='none',

help='位置參數')

parser.add_argument('csw', metavar='csw', type=str,default='none',

help='位置參數')

args = parser.parse_args()

print(args.server)

print(args.port)

print(args.user)

print(args.password)

print(args.cce)

print(args.csw)

# 輸出

# C:\\Users\\Centos\\Desktop\\source\\python>python C:\\Users\\Centos\\Desktop\\source\\cce\\func.py cce csw

# 127.0.0.1

# 8080

# none

# none

# cce

# csw


分享到:


相關文章: