Python命令行參數解析模塊argparse

argparse模塊

基本用法

import argparse
parser = argparse.ArgumentParser()
parser.add_argment('-v', '--Verbose', help='Help Text', type=str, action='store', ...)
args = parser.parse_args()

print(args.v)

ArgumentParser類的常用參數

  • prog: 程序的名稱(默認是: sys.argv[0])
  • usage: 程序使用方法說明 (默認由自動生成)
  • description: 程序的介紹
  • epilog: 程序的補充介紹, 該文字在參數介紹后邊
  • prefix_chars: 定義optional參數的前綴,默認是'-'和'--', 如果我們設置 prefix_char='-+', 那么我們可以定義以'+'或'++'為前綴的optional參數.
  • allow_abbrev: 允許對長可選參數進行縮寫(默認值), 例如:你定義了'--verbose',那么在CLI中--ver等價于--verbose, 可以通過設置allow_abbrev=False禁用縮寫.

add_argument()方法

該方法是用來向ArgumentParser類對象中加入參數的, 加入的參數可以是位置參數可以是 可選參數 也可以是標記

add_argument()的參數包括:

> name or flags - Either a name or a list of option strings, e.g. foo or -f, --foo.
> action - The basic type of action to be taken when this argument is encountered at the command line.
> nargs - The number of command-line arguments that should be consumed.
> const - A constant value required by some action and nargs selections.
> default - The value produced if the argument is absent from the command line.
> type - The type to which the command-line argument should be converted.
> choices - A container of the allowable values for the argument.
> required - Whether or not the command-line option may be omitted (optionals only).
> help - A brief description of what the argument does.
> metavar - A name for the argument in usage messages.
> dest - The name of the attribute to be added to the object returned by parse_args().

Name or Flags

位置參數(positional arguments)

代碼示例

parser.add_argument('hostname', help='server host name', type=str)

可選參數(optional arguments)

代碼示例

parser.add_argument('-p', '--port', help='the port number', type=int)

Action

  • store
    這是默認值, 僅僅是把可選參數的值進行存儲

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-a', '--address', help='server address',   type=str, action='store')
    args = parser.parse_args()
    print(args.address)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py  -a 19.1.1.1
    19.1.1.1
    
  • store_const
    這個action通常配合const參數一起使用,為可選參數設置默認值,把可選參數作為標記使用.

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-t', '--test', help='test store_const  action', action='store_const', const=80)
    args = parser.parse_args()
    print(args.test)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py  -t 
    80
    
  • store_true | store_false
    這兩個action和'store_const'類似, 不過不需要配合const參數, store_true就是為指定可選參數設置True, store_false就是為指定的可選參數設置False

    import argparse  
    
    parser = argparse.ArgumentParser()  
    parser.add_argument('-p','--passed', help='passed the exam or not',     action='store_true')  
    parser.add_argument('-f', '--fail', help='fail in the exam or not',     action='store_false')  
    args = parser.parse_args()  
    print(args.passed, args.fail)  
    
    OUTPUT:  
    [LiangZhang@MacBook test]$python3 arguments.py   
    False True  
    [LiangZhang@MacBook test]$python3 arguments.py -p -f  
    True False  
    [LiangZhang@MacBook test]$python3 arguments.py -p   
    True True  
    [LiangZhang@MacBook test]$python3 arguments.py  -f  
    False False  
    
  • append
    這個參數主要用于同一個可選參數使用多次時, 可以把這些參數的值放入一個列表.

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-p','--port', help='ports', type=int,  action='append')
    args = parser.parse_args()
    print(args.port)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py   -p 21 -p 23 -p 80
    [21, 23, 80]
    
    
  • append_const
    這個action的作用是 把多個具有默認值的可選標記的值存放到一個列表

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-w','--web',  dest='var_list',     action='append_const', const=80)
    parser.add_argument('-t', '--telent', dest='var_list',  action='append_const', const=21)  #參數dest指定所追加的參數值存入的列表名
    args = parser.parse_args()
    print(args.var_list)   #var_list容納參數的列表名, 由dest=var_list定義
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py   -t -w
    [21, 80]
    [LiangZhang@MacBook test]$python3 arguments.py   -tw
    [21, 80]
    [LiangZhang@MacBook test]$python3 arguments.py   -wt
    [80, 21]
    
    
  • count
    用于統計某一可選標記出現次數

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-v', '--verbose', action='count')
    args = parser.parse_args()
    print(args.verbose)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py   -v
    1
    [LiangZhang@MacBook test]$python3 arguments.py   -vvv
    3
    [LiangZhang@MacBook test]$python3 arguments.py   -v -v
    2
    
    
  • version
    用于顯示當前程序版本

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-v', '--version', action='version', version='%(prog)s 2.0')
    args = parser.parse_args()
    print(args.version)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py   -v 
    arguments.py 2.0
    
    

nargs

用于指定某位置參數或可選參數能接受參數值的個數.

  • nargs=N (N為參數個數)

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--ports', help='port list', nargs=3)
    parser.add_argument('-t', '--type', help='protocol type', nargs=2)
    parser.add_argument('host', help='host address', nargs=2)
    args = parser.parse_args()
    print(args.ports, args.type, args.host)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py   -p 23 22 53   -t tcp udp  192.168.1.1 www.baidu.com
    ['23', '22', '53'] ['tcp', 'udp'] ['192.168.1.1', 'www.baidu.com']
    
    
  • nargs='?' (只接收一個參數)

    • 當nargs為'?'時, 代表該位置參數或可選參數只接收一個參數值, 并且我們可以為位置參數設置默認值(default), 以及為可選參數設置默認值(default)常量值(const)

    • 默認值和常量值的區別: 對于可選參數, 默認值指的是未給出可選參數標記(如:-p)時,該參數的值, 而常量值指的是給出可選參數標記(如: -p),但未給出參數值時,該可選參數的值.

    • 注意: nargs=N時, 不可以為參數設置默認值和常量值, 所以nargs='?'是有意義的.

```python
parser = argparse.ArgumentParser()
parser.add_argument('host', nargs='?', default='www.cciex.com')
parser.add_argument('--port', '-p', nargs='?', const=23, default=22)   #給出標記'-p' 不給值時 結果為'const',  如果 不給出標記'-p' 結果為'default'.  
args = parser.parse_args()
print(args.port,  args.host)

OUTPUT:  
[LiangZhang@MacBook test]$ python3 arguments.py    www.baidu.com   -p 88   
88 www.baidu.com  
[LiangZhang@MacBook test]$  
[LiangZhang@MacBook test]$python3 arguments.py      -p    
23 www.cciex.com  
[LiangZhang@MacBook test]$  
[LiangZhang@MacBook test]$python3 arguments.py         
80 www.cciex.com  

```  


**args='?' 的常用方式**  
這個參數用法,經常被用于可選的文件輸入和輸出  

```python
import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument('--infile', '-i', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
parser.add_argument('--outfile', '-o', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
args = parser.parse_args()

for line in args.infile:
    print(line)
    args.outfile.write(line)

print('Done!')

------------
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py 
both of input and output are not given^_^    #這是從標準輸入輸入的測試字符
both of input and output are not given^_^    #這是print()打印出的測試字符

both of input and output are not given^_^    #這是從標準輸出輸出的測試字符
Done!                                               # 使用Ctl+D 終止輸入
-------------

OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py  --outfile  test.txt   #給定輸出文件參數
this time --outfile has been specified ^_^   #這是從標準輸入輸入的測試字符    this time --outfile has been specified ^_^   #這是print()打印出的測試字符

Done!                                               # 使用Ctl+D 終止輸入

[LiangZhang@MacBook test]$
[LiangZhang@MacBook test]$cat test.txt    #使用cat查看輸出文件
this time --outfile has been specified ^_^    #輸出文件內容等于輸入

```
  • args='*' (接受所有參數)
    所有參數全部被接收,并存入一個列表. 為多個位置參數使用'args="*" 沒有意義.
    如果沒有給定任何參數值, 則返回空列表.

    import argparse
    import sys
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--ports', nargs='*')
    parser.add_argument('host', nargs='*')
    args = parser.parse_args()
    print(args.host, args.ports)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com  -p 23 22 80 
    ['www.baidu.com', 'www.cciex.com'] ['23', '22', '80']
    
    
  • args='+' (接受所有參數,要求至少有一個參數)
    如果沒有給定任何參數值,則生成異常.

    import argparse
    import sys
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--ports', nargs='+')
    parser.add_argument('host', nargs='*')
    args = parser.parse_args()
    print(args.host, args.ports)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com  -p 23 80 443
    ['www.baidu.com', 'www.cciex.com'] ['23', '80', '443']
    [LiangZhang@MacBook test]$
    [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com  -p  #不給定參數返回異常
    usage: arguments.py [-h] [-p PORTS [PORTS ...]] [host [host ...]]
    arguments.py: error: argument -p/--ports: expected at least one argument
    [LiangZhang@MacBook test]$
    [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com    #不給定標記 返回None
    ['www.baidu.com', 'www.cciex.com'] None
    
    
  • args=argparse.REMAINDER (把剩余的參數放入一個列表)

    import argparse
    import sys
    
    parser = argparse.ArgumentParser()
    parser.add_argument('host', nargs=1, default='www.cciex.com')
    parser.add_argument('-p', '--ports', nargs='?', const=80, default=80)
    parser.add_argument('remains', nargs=argparse.REMAINDER)
    args = parser.parse_args()
    print(args.host, args.ports, args.remains)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py -p 443  www.baidu.com  admin root mark 
    ['www.baidu.com'] 443 ['admin', 'root', 'mark']
    
    %%注意:%% args=argparse.REMAINDER的'吞噬能力'很強, 所以在CLI中輸入參數時, 不要把可選參數放在REMAINDER之前, 否則連同可選參數標記(-p)和可選參數值(例:443),全部會被認定為剩余參數. 
     
    OUTPUT2: 
    [LiangZhang@MacBook test]$python3 arguments.py   www.baidu.com   -p 443  admin root mark 
    ['www.baidu.com'] 80 ['-p', '443', 'admin', 'root', 'mark']
    
    
    

const (參數常量)

  • 為可選參數設置參數常量值, 當在CLI中只給出了參數標記,但沒有給出參數值時, 該常量為參數值, 代碼樣例見: Action章節的 'store_const' 和 'append_const'

default (參數默認值)

  • 可以做為可選參數和位置參數的默認值, 當位置參數未給出,或是可選參數標記未給出, 那么參數值為默認值. 代碼樣例見: nargs='?' 等多處章節.

type (規定參數類型)

  • 用于將CLI中輸入的參數轉換為指定的類型, 當類型無法轉換時產生異常.

    parser.add_argument('-p', '--port', type=int)     #如果輸入是非數字的字符,則產生異常
    
  • 也可以用于將輸入的字符做出文件名,返回文件句柄. 樣例: 見 args='?' 常用方法章節.

  • 也可以自定義類型轉換函數.

     def perfect_square(string):     #用于測試一個參數是否能夠被完全開平方
         value = int(string)            #轉換輸入為整型
         sqrt = math.sqrt(value)        #對輸入開方
         if sqrt != int(sqrt):          #把平方根的值 和 int轉換后的平方根對比, 如果一致說明平方根是整數, 原輸入值可以被完全開方.
             msg = "%r is not a perfect square" % string
             raise argparse.ArgumentTypeError(msg)     #如果不能被完全開方, 那么生成異常.
         return value    #如果可以被完全開發, 返回轉換為整型的原輸入
    
     parser = argparse.ArgumentParser(prog='PROG')
     parser.add_argument('foo', type=perfect_square)
     
     parser.parse_args(['9'])   #模擬輸入9, 測試OK
    Namespace(foo=9)
     parser.parse_args(['7'])  #模擬輸入7, 返回異常
    usage: PROG [-h] foo
    PROG: error: argument foo: '7' is not a perfect square
    
    

choices

用于為位置參數或可選參數設限定一個范圍.

    import argparse
    import sys

    parser = argparse.ArgumentParser()
    parser.add_argument('name', choices=['mark', 'Eric', 'Jonan'])
    parser.add_argument('-f', '--food', choices=['Jiaozi', 'rice'])
    args = parser.parse_args()
    print(args.name, args.food)
    
    OUTPUT: 
    [LiangZhang@MacBook test]$python3 arguments.py  mark -f Jiaozi
    mark Jiaozi
    
    [LiangZhang@MacBook test]$python3 arguments.py  mark -f shrimp      #參數不在給定范圍時,會給出錯誤提示.
    usage: arguments.py [-h] [-f {Jiaozi,rice}] {mark,Eric,Jonan}
    arguments.py: error: argument -f/--food: invalid choice: 'shrimp' (choose from 'Jiaozi', 'rice')


required

通常來講, 諸如-f或--foo 一般被視為可選參數, 在CLI中可以添加也可以不加, 可以通過設置required=True 來指定該可選參數為必選參數.

parser = argparse.ArgumentParser()
parser.add_argument('--foo', '-f', required=True)  #指定CLI中必須包含-f參數
args = parser.parse_args()

help

對參數的一個功能描述, 當用戶使用-h時, 會顯示該描述.

parser = argparse.ArgumentParser(prog='frobble')
parser.add_argument('--foo', action='store_true', help='foo the bars before frobbling')

metavar

用于自定義幫助信息(-h得到的輸出)中的位置參數和可選參數的參數值的展示樣例.
默認help輸出中的位置參數的參數值示例直接使用位置參數名稱, 可選參數的參數值樣例則是把可選參數大寫, 如下:

parser = argparse.ArgumentParser()
parser.add_argument('date', help='current date')
parser.add_argument('-f', '--food', help='your favorite food')
args = parser.parse_args()
print(args.date, args.food)

OUTPUT:

[LiangZhang@MacBook test]$python3 arguments.py -h
usage: arguments.py [-h] [-f FOOD] date         #輸出中的FOOD是可選參數的大寫形式, 'date'直接使用位置參數名.

positional arguments:
  date                  current date

optional arguments:
  -h, --help            show this help message and exit
  -f FOOD, --food FOOD  your favorite food

使用metavar之后的代碼:

parser = argparse.ArgumentParser()
parser.add_argument('date', help='current date', metavar='YY-MM-DD')
parser.add_argument('-f', '--food', help='your favorite food', metavar='Food_Name')
args = parser.parse_args()
print(args.date, args.food)

OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py -h
usage: arguments.py [-h] [-f Food_Name] YY-MM-DD     #Food_Name和YY-MM-DD均使用了自定義的示例名稱

positional arguments:
  YY-MM-DD              current date

optional arguments:
  -h, --help            show this help message and exit
  -f Food_Name, --food Food_Name
                        your favorite food

如果使用nargs參數后, 那么一個可選參數可能需要接受多個參數值, 這時我們可以為metavar傳出一個元組, 為多個參數值設置示例名:

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', nargs=2)
parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))

OUTPUT:
usage: PROG [-h] [-x X X] [--foo bar baz]    #為--foo的兩個參數值設置不同的示例名

dest

dest是一個argpars.ArgumentParser對象被解析以后, args引用參數值的變量名稱.

默認:

  • 位置參數的dest為位置參數的參數名
  • 可選參數的dest為:
  1. 合規長參數去掉前綴'--', 如: --foo的dest為foo
  2. 不合規長參(參數名包含'-')數去掉前綴'--', 并且把參數名中的'-'變為' _ ', 例如: --food-name的dest為food_name.
  3. 如果沒有長參數, 那么短參數去掉前綴'-', 如: -p的dest為p

例如:

parser.add_argument('date', help='current date', metavar='YY-MM-DD')  #date為該參數的dest
parser.add_argument('-f', '--food-name', help='your favorite food', metavar='FoodName')   #food_name為該參數的dest  
args = parser.parse_args()
print(args.date, args.food_name)   #date和food_name為 dest

可以使用dest參數自己定義dest名稱

import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--food', dest='snack', help='your favorite food',)   #snack為--food的dest名稱
args = parser.parse_args()
print(args.snack)     #我們需要使用args.snack來引用參數--food的參數值. 

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容