1. 程式人生 > >Python 使用argparse模組解析命令列讀取引數簡介

Python 使用argparse模組解析命令列讀取引數簡介

在多個檔案或者不同語言協同的專案中,python指令碼經常需要從命令列直接讀取引數。萬能的python就自帶了argprase包使得這一工作變得簡單而規範。PS:optparse包是類似的功能,只不過寫起來更麻煩一些。

如果指令碼很簡單或臨時使用,沒有多個複雜的引數選項,可以直接利用sys.argv將指令碼後的引數依次讀取(讀進來的預設是字串格式)。比如如下名為test.py的指令碼:

import sys
print "Input argument is %s" %(sys.argv[0])

在shell指令碼中執行python test.py help可以得到Input argument is help

的結果。
1) 一般形式
但是大多數情況下,指令碼很可能需要多個引數,而且每次引數的型別用處各不相同,那麼這個時候在引數前新增標籤表明引數的型別和用途便十分有用,而利用argparse模組可以很方便得實現這一目的。
同樣用名為test.py的指令碼舉個栗子:

import argparse

parser = argparse.ArgumentParser(description="your script description")            # description引數可以用於插入描述指令碼用途的資訊,可以為空
parser.add_argument('--verbose', '-v'
, action='store_true', help='verbose mode') # 新增--verbose標籤,標籤別名可以為-v,這裡action的意思是當讀取的引數中出現--verbose/-v的時候 # 引數字典的verbose建對應的值為True,而help引數用於描述--verbose引數的用途或意義。 args = parser.parse_args() # 將變數以標籤-值的字典形式存入args字典
if args.verbose: print "Verbose mode on!" else: print "Verbose mode off!"

執行python test.py後面跟了--verbose/-v的時候會輸出前者,如果什麼都沒有會輸出後者。如果輸入了--verbose/-v以外的引數則會報錯:unrecognized arguments
稍微提一下,action引數表示值賦予鍵的方式,這裡用到的是bool型別;如果是'count'表示將--verbose標籤出現的次數作為verbose的值;'append'表示將每次出現的該便籤後的值都存入同一個陣列再賦值。(嘛,一般後面兩種用的比較少就不多說了)
PS:--help標籤在使用argparse模組時會自動建立,因此一般情況不需要我們主動定義幫助資訊。

$ python test.py --help
usage: test.py [-h] [--verbose]

your script description

optional arguments:
    -h, --help        show this help message and exit
    --verbose, -v     verbose mode  

2) 必需引數
這種模式用於確保某些必需的引數有輸入。
parser.add_argument('--verbose', required=True, type=int)
required標籤就是說--verbose引數是必需的,並且型別為int,輸入別的型別會報錯。

3)位置引數(positional arguments)
位置引數與sys.argv呼叫比較像,引數沒有顯式的--xxx或者-xxx標籤,因此呼叫屬性也與sys.argv相同。

parser.add_argument('filename')    # 輸入的第一個引數賦予名為filename的鍵
args = parser.parse_args()
print "Read in %s" %(args.filename)

輸入python test.py test.txt則會輸出Read in test.txt
此外,可以用nargs引數來限定輸入的位置引數的個數,預設為1。當然nargs引數也可用於普通帶標籤的引數。
parser.add_argument('num', nargs=2, type=int)表示指令碼可以讀入兩個整數賦予num鍵(此時的值為2個整數的陣列)。nargs還可以'*'用來表示如果有該位置引數輸入的話,之後所有的輸入都將作為該位置引數的值;‘+’表示讀取至少1個該位置引數。'?'表示該位置引數要麼沒有,要麼就只要一個。(PS:跟正則表示式的符號用途一致。)比如用:

parser.add_argument('filename')
parser.add_argument('num', nargs='*)

就可以執行python test.py text.txt 1 2
由於沒有標籤,所以用位置引數的時候需要比較小心。

4)輸入型別
之前已經提到了用type引數就可以指定輸入的引數型別。而這個type型別還可以表示檔案操作的型別從而直接進行檔案的讀寫操作。

parser.add_argument('file', type=argparser.FileType('r'))    # 讀取檔案
args = parser.parse_args()
for line in args.file:
    print line.strip()

5)引數預設值
一般情況下會設定一些預設引數從而不需要每次輸入某些不需要變動的引數,利用default引數即可實現。

parser.add_argument('filename', default='text.txt')

這個時候至直接執行python text.py就能得到Read in text.txt而不需要輸入檔名了。

6)候選引數選擇
表示該引數能接受的值只能來自某幾個值候選值中,除此以外會報錯,用choices引數即可。比如:

parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])

相關命令再解釋:

1:import argparse

2:parser = argparse.ArgumentParser()

3:parser.add_argument()

4:parser.parse_args()

解釋:首先匯入該模組;然後建立一個解析物件;然後向該物件中新增你要關注的命令列引數和選項,每一個add_argument方法對應一個你要關注的引數或選項;最後呼叫parse_args()方法進行解析;解析成功之後即可使用,下面簡單說明一下步驟2和3。

方法ArgumentParser(prog=None, usage=None,description=None, epilog=None, parents [],formatter_class=argparse.HelpFormatter, prefix_chars='-',fromfile_prefix_chars=None, argument_default=None,conflict_handler='error', add_help=True)

這些引數都有預設值,當呼叫parser.print_help()或者執行程式時由於引數不正確(此時python直譯器其實也是呼叫了pring_help()方法)時,會列印這些描述資訊,一般只需要傳遞description引數,如上。

方法add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

其中:

name or flags:命令列引數名或者選項,如上面的address或者-p,--port.其中命令列引數如果沒給定,且沒有設定defualt,則出錯。但是如果是選項的話,則設定為None

nargs:命令列引數的個數,一般使用萬用字元表示,其中,'?'表示只用一個,'*'表示0到多個,'+'表示至少一個

default:預設值

type:引數的型別,預設是字串string型別,還有float、int等型別

help:和ArgumentParser方法中的引數作用相似,出現的場合也一致

來源: https://www.cnblogs.com/arkenstone/p/6250782.html

歡迎關注公眾號學習自然語言處理技術