Python學習筆記-argparse模組
阿新 • • 發佈:2021-10-25
Python學習筆記-argparse模組
optparseargparse昨天學習了一個簡單的埠掃描器的指令碼,其中涉及到了optparse模組,網上關於此模組的介紹已有很多,但這個模組已經不更新了,新的模組叫argparse。百度學習了argparse的用法後,這裡簡單比較一下二者,僅為加深自己的理解
一、optparse
optparse模組用於解析命令列,可以自己定製程式的引數選項控制。
optparse支援一般性GUN的選項方法,包括:
1.無引數選項, -v 2.有引數項, -p value, -para=value 3.值參一體, -pvalue(不支援長引數) 4.合併選項, -abc,-abcp value(最後一個可以是有參,其餘均無參)
解析時,- 和 --的區別:
- - 看後面的值,如果時無參的,繼續下一個;有參, 就把引數讀進來;
- -- 直接讀後面的值;
1. 基本用法
1.載入OptionParser類,新建物件:OptionParser()
2.新增選項: add_option()
3.引數解析: parse_args()
舉個例子:
import optparse
from optparse import OptionParser
parser=optparse.OptionParser("usage%prog "+"-H <target host> -p <target port>" )
#通過OptionParser建立parser例項,初始引數usage中的%prog等同於os.path.basename(sys.argv[0]),即當前所執行的指令碼的名字。
parser.add_option('-H',dest='tgtHost',type='string',help='specify target host')
parser.add_option('-p',dest='tgtPost',type='int',help='specify target post')
(options,args)=parser.parse_args()
2. 新建物件
parser=OptionParse()
形參包括:
def __init__(self,
usage=None,
option_list=None,
option_class=Option,
version=None,
conflict_handler="error",
description=None,
formatter=None,
add_help_option=True,
prog=None,
epilog=None):
3. 新建選項:
3-1. 可以使用以下幾個方法:
add_option,add_option_group,add_options.
3-2. 具體引數分析:
add_option(...):
add_option 方法中前面的引數為命令的選項,可以為等價的短名或長名,一般是前面為短名,後面為長名。
可配置的引數為:
dest:可以決定解析後,取值時的屬性名,尤其適於多個等價引數,不指定時就是選項不加-的字串.
type:選項的值型別,值的預設型別是字串,這裡將值指定為其他型別.
default:預設值,沒有設定預設值的為None.
help:選項中有-h 時列印的help資訊.
metavar:表示顯示到help中選項的預設值;
choices:當type設定為choices時,需要設定此值.
const:指定一個常量值給選項,該常量值將用於後面store_const和append_const,一起合用
action:用於控制對選項和引數的處理,像無引數選項處理,可以設定為以下幾種字串:
"store":儲存值到dest指定的屬性,強制要求後面提供引數;
"store_ture":當使用該選項時,後面的dest將設定為true,不跟引數.
"store_false":當使用該選項時,後面的dest將設定為false.常配合"store_ture"使用一個dest時使用.不跟引數
"append":儲存值到dest指定的屬性,並且是以陣列的形式,必須跟引數.
"store_const":用來儲存引數為const設定的值到dest指定的屬性中.常用於dest為同名2個以上選項時的處理.不跟引數
"append_const":用來儲存引數為const設定的值到dest指定的屬性中.
"count":使用後將給儲存值到dest指定的屬性值加1,可以統計引數中出現次數.用途不大,不跟引數.
當action設定為store_ture/store_false時,解析引數時,如果有值時為 Ture/False,沒有值時為None.
當dest值相同時,一個action設定為store_false,另一個設定為store_ture時,解析引數時,以在後面出現的為準.
4. 引數解析parse_args()
使用parse_args()
對引數進行解析,預設是使用sys.argv[1:]
[1]作為引數,也可以傳遞一個命令列引數列表:parse_args(list)
parse-args()
返回兩個值:
options
,它是一個物件,儲存有命令列引數值。只要知道命令列引數名,如input
,就可以訪問其對應的值:options.input
args
,它是沒被解析的命令列引數的列表。
二、argparse
argparse
模組可以輕鬆編寫使用者友好的命令列介面。該程式定義了它需要的引數,argparse
並將找出如何解析這些引數sys.argv
。
argparse
模組還會自動生成幫助和用法訊息,並在使用者給出程式無效引數時發出錯誤。
舉個例子:
import argparse #匯入athparse模組
parser=argparse.ArgumentParser()
#建立解析器物件ArgumentParser,可以新增引數。
parser.add_argument("echo",help="echo the string")
args=parser.parse_args()
print(args.echo)
1. add_argument()
add_argument()方法,用來指定程式需要接受的命令引數
- 定位引數:
parser.add_argument("echo",help="echo the string")
- 可選引數:
parser.add_argument("--verbosity",help="increase output verbosity") 在執行程式時,定位引數必選,可選引數可選。
add_argument()常用引數
- dest:如果提供dest,例如dest="a",那麼可以通過args.a訪問該引數
- default:設定引數的預設值
- action:引數發出的動作
- store:儲存引數,預設
- store_const:儲存一個被定義為引數規格的一部分的值(常量),而不是一個來自引數解析而來的值。
- store_ture/store_false:儲存相應的布林值
- append:將值儲存在一個列表中
- append_const:將一個定義在引數規格中的值(常量)儲存在一個列表中
- count:引數出現的次數
- parser.add_argument("-v","--verbosity",action="count",default=0,help="increase output verbosity")
- version:版本資訊
- type:把從命令列輸入的結果轉成設定的型別
- choice:允許的引數值
- parser.add_argument("-v","--verbosity",type=int,choices=[0,1,2],help="increase output verbosity")
- help:引數命令介紹
2. ArgumentParser.parse_known_args()解析
此函式用於一個指令碼只需要解析所有命令列引數的一小部分,剩下的命令列引數給一兩個指令碼或程式。在這種情況下,parse_known_args() 就很有用。它很像parse_args(),但是它在接受到多餘的命令列引數時不報錯。相反的,返回一個包含已填充名稱空間和剩餘引數字串列表的兩個專案元組。
比如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
'--input',type=int,default=0,help='input.'
)
INPUT, unparsed = parser.parse_known_args()
print(INPUT)
print(unparsed)
執行後返回:
$ python>test.py --input 1 --double 0.01 a
Namespace(input=1)
['--double', '0.01', 'a']
三、區別:
argparse模組以多種方式改進了optparse模組,包括:
- 處理位置引數
- 支援子命令
- 用
optparse.OptionParser.add_option()
呼叫替換所有ArgumentParser.add_argument()
呼叫。 - 更換
(options, args) = parser.parse_args()
用args = parser.parse_args()
並新增額外ArgumentParser.add_argument()
的定位引數呼叫。 - 其它的用到再補充。
-
在Python中,引數是元素
sys.argv[1:]
(sys.argv[0]
是正在執行的程式的名稱). ↩