Python學習之argparse模塊


前言

  近幾天一直在學習解析命令行參數和選項的模塊argparse,這是Python再帶的用於解析命令行參數和選項的標准模塊,很早之前的optparse模塊已經過時並被argparse模塊取代。相信很多小伙伴在學習這個庫的時候遇到了很多不懂的問題,很多坑,看官方的API由於是英文的很多小伙伴也甚至捉急,其實最好的學習方法還是看官方文檔,博主就根據自己在學習時候遇到的坑來淺談一下argparse。

基本認識

  最好的認知方法那就是舉例子,下面我們先從一個基本的程序說起。

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

我們將以上代碼保存成prog.py文件,在dos下運行這個腳本文件下面我們看一下運行結果:

$ python prog.py
$ python prog.py --help
usage: prog.py [-h]

optional arguments:
-h, --help show this help message and exit
$ python prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo

結果分析:

  1. 若不給參數而運行這個程序,將不會得到任何結果。
  2. 第二條命名顯示了使用的argparse的好處,你什么也沒做,卻得到了一個很好的幫助信息。
  3. 我們無需人為設置–help參數,就能得到一個良好的幫助信息。但是若給其他參數(比如foo)就會產生一個錯誤。

使用步驟

1:import argparse

2:parser = argparse.ArgumentParser()

3:parser.add_argument()

4:parser.parse_args()

   我們對這四個步驟解釋一下:首先導入該模塊;然后創建一個解析對象;然后向該對象中添加你要關注的命令行參數和選項,每一個add_argument方法對應一個你要關注的參數或選項;最后調用parse_args()方法進行解析;解析成功之后即可使用。

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

   首先,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參數,如上所示。

下面將對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中添加的選項的名字發生沖突時怎么處理,默認處理是拋出異常。

   方法add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, 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。

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

在控制台終端上輸入python prog.py -h即可獲得幫助說明。

$ python prog.py -h
usage: prog.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
N an integer for the accumulator

optional arguments:
-h, --help show this help message and exit
--sum sum the integers (default: find the max)

注意上面的 -h, –help, –sum 都是可選參數。

在再終端帶參數輸入命令行中,即可求得值:

$ python prog.py 1 2 3 4
4

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

我們下面來看一段代碼:

# -*- coding: utf-8 -*-

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
parser.add_argument("--square", help="display a square of a given number",
type=int)

args = parser.parse_args()
print(args.accumulate(args.integers), args.square**2)

我們在控制台dos界面下輸入 python prog.py 4 5 6 –square 7
我們可以看一下運行結果:

這里寫圖片描述

  可以看到輸出結果是 6 49 這里的49我們很容易理解,是對輸入的參數7進行平方操作,那么為什么前面是6呢,注意看我們上面定義的前兩個parser.add_argument()這兩個方法的參第一個參數形式是不同,一個是不帶有“–”前綴的,而另外一個是帶有這個前綴的,那么這兩個有什么區別呢。原來帶有“–”這個前綴的參數是可選參數,即進行參數傳遞時可以有選擇的進行傳遞,如果直接寫參數的話,那就是默認操作,可以看出是取參數中列表中的最大值,如果想對這個可選參數進行參數傳遞,那就得按照后面的“–”帶有這個前綴的參數傳遞方法與“–square”一樣,這樣傳遞過去參數就是執行sum的操作了,下面我們就操作一下看看。

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

這里寫圖片描述

可以看到輸出結果是 15 49 ,神奇吧。還有一個要注意的問題就是:add_argument()方法傳遞的參數類型默認為字符型,如果你要用到其他類型的數據,可以在最后結果上面強制轉換,也可以像上面的–square一樣指明type,官方還是比較推薦后面這種做法。

這次的分享就到這里吧,還要繼續學習前行啊!


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: