1. 程式人生 > 其它 >Python學習筆記-argparse模組

Python學習筆記-argparse模組

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()的定位引數呼叫。
  • 其它的用到再補充。

  1. 在Python中,引數是元素sys.argv[1:](sys.argv[0]是正在執行的程式的名稱).