1. 程式人生 > >(轉)Python3 -- argparse模組

(轉)Python3 -- argparse模組

原文地址:http://www.cnblogs.com/arkenstone/p/6250782.html

http://blog.csdn.net/WIinter_FDd/article/details/75786410

 https://oldpan.me/archives/argparse-python-order-command--------Argparse-parser模組:python快捷實現命令列操作

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

 

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

 

在shell指令碼中執行python test.py 可以得到Input argument is test.py 的結果。

1) 一般形式

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

 

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


執行python test.py後面跟了--verbose/-v的時候會輸出前者,如果什麼都沒有會輸出後者。如果輸入了--verbose/-v以外的引數則會報錯:unrecognized arguments
稍微提一下,action引數表示值賦予鍵的方式,這裡用到的是bool型別;如果是'count'表示將--verbose標籤出現的次數作為verbose的值;'append'表示將每次出現的該便籤後的值都存入同一個陣列再賦值。(嘛,一般後面兩種用的比較少就不多說了)

 

 

PS:--help標籤在使用argparse模組時會自動建立,因此一般情況不需要我們主動定義幫助資訊。

 

  1.   $ python test.py --help
  2.   usage: test.py [-h] [--verbose]
  3.    
  4.   your script description
  5.    
  6.   optional arguments:
  7.   -h, --help show this help message and exit
  8.   --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相同。

 

  1.   parser.add_argument( 'filename') # 輸入的第一個引數賦予名為filename的鍵
  2.   args = parser.parse_args()
  3.   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:跟正則表示式的符號用途一致。)比如用:

 

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

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

 

4)輸入型別

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

 

  1.   import argparse
  2.    
  3.   parser = argparse.ArgumentParser(description= "your script description")
  4.   parser.add_argument( 'file', type=argparse.FileType('r')) # 讀取檔案
  5.   args = parser.parse_args()
  6.   for line in args.file:
  7.   print (line.strip())


寫檔案

 

 

  1.   import argparse
  2.    
  3.   parser = argparse.ArgumentParser(description= "your script description")
  4.   parser.add_argument( 'file', type=argparse.FileType('w')) # 寫檔案
  5.   args = parser.parse_args()
  6.   fp=args.file
  7.   fp.write( '123345')
  8.   fp.flush()
  9.   fp.close()
  10.    

 

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'])

 

參考:https://mkaz.tech/python-argparse-cookbook.html
https://docs.python.org/2/howto/argparse.html

 

7)使用步驟

 

1:import argparse

2:parser = argparse.ArgumentParser()

3:parser.add_argument()

4:parser.parse_args()

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

接下來我們來說明一下argparse模組中最重要的兩個部分:ArgumentParser()和add_argument()。

 

  1.   ArgumentParser(prog= None,usage=None,description=None, epilog=None, parents=[ ],
  2.   formatter_class=argparse.HelpFormatter, prefix_chars=’-‘,fromfile_prefix_chars= None,
  3.   argument_default= None, conflict_handler=’error’,add_help=True)

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

 

 

下面將對ArgumentParser引數的簡單說明進行中文版本的簡單說明:

 

  1. description - 命令列幫助的開始文字,大部分情況下,我們只會用到這個引數
  2. epilog - 命令列幫助的結尾文字
  3. prog - (default: sys.argv[0])程式的名字,一般不需要修改,另外,如果你需要在help中使用到程式的名字,可以使用%(prog)s
  4. prefix_chars - 命令的字首,預設是-,例如-f/–file。有些程式可能希望支援/f這樣的選項,可以使用prefix_chars=”/”
  5. fromfile_prefix_chars - (default: None)如果你希望命令列引數可以從檔案中讀取,就可能用到。例如,如果fromfile_prefix_chars=’@’,命令列引數中有一個為”@args.txt”,args.txt的內容會作為命令列引數
  6. add_help - 是否增加-h/-help選項 (default: True),一般help資訊都是必須的,所以不用設定啦。
  7. parents - 型別是list,如果這個parser的一些選項跟其他某些parser的選項一樣,可以用parents來實現繼承,例如parents=[parent_parser]
  8. 三個允許的值: # class argparse.RawDescriptionHelpFormatter 直接輸出description和epilog的原始形式(不進行自動換行和消除空白的操作) # class argparse.RawTextHelpFormatter 直接輸出description和epilog以及add_argument中的help字串的原始形式(不進行自動換行和消除空白的操作) # class argparse.ArgumentDefaultsHelpFormatter 在每個選項的幫助資訊後面輸出他們對應的預設值,如果有設定的話。這個最常用吧!
  9. argument_default - (default: None)設定一個全域性的選項的預設值,一般每個選項單獨設定,所以這個引數用得少,不細說
  10. usage - (default: generated)如果你需要修改usage的資訊(usage: PROG [-h] [–foo [FOO]] bar [bar …]),那麼可以修改這個,一般不要修改。
  11. conflict_handler - 不建議使用。這個在極端情況下才會用到,主要是定義兩個add_argument中新增的選項的名字發生衝突時怎麼處理,預設處理是丟擲異常。

 

 

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

 

  1. name or flags - 指定引數的形式,想寫幾個寫幾個,不過我們一般就寫兩個,一個短引數,一個長引數,看下面的例子”-f”, “–file”
  2. 可選的選項,位置不固定,想怎麼寫就怎麼寫,預設是可選的 # parser.add_argument(“-f”, “–file”, help=”test test test”)
  3. 位置固定的選項,例如”prog i_am_bar”,這樣子的話,i_am_bar就是bar選項的值啦,預設是必須有的 # parser.add_argument(“bar”, help=”test test test”)
  4. nargs - 指定這個引數後面的value有多少個,例如,我們希望使用-n 1 2 3 4,來設定n的值為[1, 2, 3, 4] #parser.add_argument(“-n”, “–num”, nargs=”+”, type=int) # 這裡nargs=”+”表示,如果你指定了-n選項,那麼-n後面至少要跟一個引數,+表示至少一個,?表示一個或0個,*0個或多個 。
  5. default - 如果命令列沒有出現這個選項,那麼使用default指定的預設值 #parser.add_argument(“+g”, “++gold”, help=”test test test”,default=”test_gold”)#需要prefix_chars包含”+” 。
  6. type - 如果希望傳進來的引數是指定的型別(例如 float, int or file等可以從字串轉化過來的型別),可以使用 #parser.add_argument(“-x”, type=int) 。
  7. choices - 設定引數值的範圍,如果choices中的型別不是字串,記得指定type哦 #parser.add_argument(“-y”, choices=[‘a’, ‘b’, ‘d’])
  8. required - 通常-f這樣的選項是可選的,但是如果required=True那麼就是必須的了 #parser.add_argument(“-z”, choices=[‘a’, ‘b’, ‘d’], required=True)
  9. metavar - 引數的名字,在顯示 幫助資訊時才用到. # parser.add_argument(“-o”, metavar=”OOOOOO”)
  10. help - 設定這個選項的幫助資訊
  11. dest - 設定這個選項的值就是解析出來後放到哪個屬性中 #parser.add_argument(“-q”, dest=”world”)
  12. args = parser.parse_args(args) # 如果你沒有args引數,那麼就使用sys.argv,也就是命令列引數啦。有這個引數,就方便我們除錯啊 。# args.world就是-q的值啦
  13. action - The basic type of action to be taken when this argument is encountered at the command line.
  14. const - A constant value required by some action and nargs selections.

 

最常用的引數也就是以上這些,如果有更多的需求,那麼可以檢視官方的API文件。

例項

下面我們將用官網的一個例項來進一步認識一下argparse。

 

  1.   import argparse
  2.    
  3.   parser = argparse.ArgumentParser(description= 'Process some integers.')
  4.   parser.add_argument( 'integers', metavar='N', type=int, nargs='+',
  5.   help= 'an integer for the accumulator')
  6.   parser.add_argument( '--sum', dest='accumulate', action='store_const',
  7.   const=sum, default=max,
  8.   help= 'sum the integers (default: find the max)')
  9.    
  10.   args = parser.parse_args()
  11.   print(args.accumulate(args.integers))

 

 

  1.   $ python prog.py -h
  2.   usage: prog.py [-h] [--sum] N [N ...]
  3.    
  4.   Process some integers.
  5.    
  6.   positional arguments:
  7.   N an integer for the accumulator
  8.    
  9.   optional arguments:
  10.   -h, --help show this help message and exit
  11.   --sum sum the integers (default: find the max)

 

  1.   $ python prog.py 1 2 3 4
  2.   4
  3.    
  4.   $ python prog.py 1 2 3 4 --sum
  5.   10

我們下面來看一段程式碼:

  1.   # -*- coding: utf-8 -*-
  2.    
  3.   import argparse
  4.    
  5.   parser = argparse.ArgumentParser(description= 'Process some integers.')
  6.   parser.add_argument( 'integers', metavar='N', type=int, nargs='+',
  7.   help= 'an integer for the accumulator')
  8.   parser.add_argument( '--sum', dest='accumulate', action='store_const',
  9.   const=sum, default=max,
  10.   help= 'sum the integers (default: find the max)')
  11.   parser.add_argument( "--square", help="display a square of a given number",
  12.   type=int)
  13.    
  14.   args = parser.parse_args()
  15.   print(args.accumulate(args.integers), args.square** 2)


在控制檯dos介面下輸入 python prog.py 4 5 6 –square 7

 

結果: 6  49

在dos視窗下鍵入python prog.py –sum 4 5 6 –square 7,按回車鍵我們來看一下執行結果:

結果:15  49