1. 程式人生 > >python3中argparse模組詳解

python3中argparse模組詳解

python標準庫sys模組

sys模組

用於提供對Python直譯器相關的操作:

sys.argv           #命令列引數List,第一個元素是程式本身路徑
sys.exit(n)        #退出程式,正常退出時exit(0)
sys.version        #獲取Python解釋程式的版本資訊
sys.maxint       #  最大的Int值
sys.path           #返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform       #返回作業系統平臺名稱
sys.stdin          #輸入相關
sys.stdout #輸出相關 sys.stderror #錯誤相關
python命令列引數(sys.argv)
  • 有時候我們需要寫一些指令碼處理一些任務,這時候往往需要提供一些命令列引數,根據不同引數進行不同的處理,在Python裡,命令列的引數和C語言很類似(因為標準Python是用C語言實現的)。在C語言裡,main函式的原型為int main(int argc, char ** argv),這裡主要指linux平臺, argc指的是命令列傳入的引數個數(程式的name為第一個引數),而argv則是一個指標陣列,每一個元素為指向一個命令列引數的指標。在Python裡的命令列引數是儲存在sys.argv裡,argv是一個列表,第一個元素也為程式名稱。
  #### sys.argv練習
  import sys
  for i in sys.argv:
      print(i)

  #if __name__ == '__main__':
  #    for item in sys.argv:
  #        print item

argparse模組

作用: argparse 是 Python 內建的一個用於命令項選項與引數解析的模組,通過在程式中定義好我們需要的引數,argparse 將會從 sys.argv 中解析出這些引數,並自動生成幫助和使用資訊。當然,Python 也有第三方的庫可用於命令列解析,而且功能也更加強大,比如 docopt

Click

1. 命令列引數分為位置引數和選項引數:
  • 位置引數就是程式根據該引數出現的位置來確定的
  • 選項引數是應用程式已經提前定義好的引數,不是隨意指定的
2. 使用步驟:

(1)import argparse 首先匯入模組
(2)parser = argparse.ArgumentParser() 建立一個解析物件
(3)parser.add_argument() 向該物件中新增你要關注的命令列引數和選項
(4)parser.parse_args() 進行解析

3. argparse.ArgumentParser()方法引數須知:一般我們只選擇用description
  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中新增的選項的名字發生衝突時怎麼處理,預設處理是丟擲異常。
4. add_argument()方法引數須知:
  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.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('echo')     # add_argument()指定程式可以接受的命令列選項
args = parser.parse_args()      # parse_args()從指定的選項中返回一些資料
print(args)
print(args.echo)
parser = argparse.ArgumentParser(description = 'this is a description')
parser.add_argument('--ver', '-v', action = 'store_true', help = 'hahaha')
# 將變數以標籤-值的字典形式存入args字典
args = parser.parse_args()
if args.ver:
    print("Ture")
else:
    print("False")
# required標籤就是說--ver引數是必需的,並且型別為int,輸入其它型別會報錯
parser.add_argument('--ver', '-v', required = True, type = int)
parser.add_argument('file', choices = ['test1', 'test2'])
args = parser.parse_args()
print('read in %s'%(args.file))
# 表示指令碼可以讀入兩個整數賦予num鍵(此時的值為2個整數的陣列)
parser.add_argument('filename', nargs = 2, type = int)
args = parser.parse_args()
print('read in %s'%(args.filename))

分析:nargs還可以’*‘用來表示如果有該位置引數輸入的話,之後所有的輸入都將作為該位置引數的值;‘+’表示讀取至少1個該位置引數。’?'表示該位置引數要麼沒有,要麼就只要一個。(PS:跟正則表示式的符號用途一致。)
如:

parser.add_argument('filename', nargs = '+', type = int)
args = parser.parse_args()
print('read in %s'%(args.filename))

dest - 設定這個選項的value解析出來後放到哪個屬性中

parser.add_argument('-file', choices = ['test1', 'test2'], dest = 'world')
args = parser.parse_args()
print('read in %s'%(args.world))