Python命令行參數(shù)解析模塊 argparse

簡介

Python 中自帶的argparse模塊可以用于提供簡潔易用的命令行參數(shù)解析桅打。

程序內(nèi)部定義了需要使用的參數(shù)挺尾,argparse 會默認(rèn)自動從 sys.argv中解析出對應(yīng)的參數(shù)丽柿。argparse模塊會自動生成幫助信息和使用提示甫题,同時當(dāng)用戶使用無效參數(shù)時坠非,會顯示錯誤原因麻顶。

注: Python 中還有其他兩個模塊可以提供相同的命令行參數(shù)解析功能:getopt(等同于 C 語言的getopt())和optparse(Python2.7以后被標(biāo)記為 Deprecated队萤,不會繼續(xù)發(fā)展)要尔。
其中赵辕,argparse是基于optparse的進(jìn)一步封裝,因此這兩者擁有相似的使用方法私杜。

參數(shù)類型說明

命令行參數(shù)類型可以分為以下兩種:

  • 位置參數(shù)(positional argument):位置參數(shù)擁有一個具體的名字衰粹,以便讓程序知道如何使用其值铝耻。比如cp SRC DEST频丘,參數(shù)SRCDEST就是兩個位置參數(shù)椎镣,其值類型為字符串。
  • 可選參數(shù)(optional argument):可選參數(shù)用于提供額外信息給到程序,讓程序可以提供額外的一些操作亮钦。比如ls -als --all蜂莉,-a--all就是可選參數(shù)窖张,應(yīng)用程序ls接收到-a/--all參數(shù)后宿接,就會使能顯示隱藏文件功能睦霎。

命令行參數(shù)通用格式為:program [optional] positional

簡單示例

下面列舉一些簡單的例子碑幅,力求對 argparse有一個初步的了解枕赵。更多詳細(xì)的示例,請參考:Argparse Tutorial

示例1. 添加一個位置參數(shù):square篮昧,其類型為int

import argparse
#創(chuàng)建一個參數(shù)解析實例
parser = argparse.ArgumentParser()
#添加參數(shù)解析
parser.add_argument("square", help="display a square of a given number",
                    type=int)
#開始解析
args = parser.parse_args()
print(args.square**2)

上述代碼生成的程序使用格式為:usage: argTest.py [-h] square懊昨,因此具體使用應(yīng)類似:$ python3 argTest.py 4

argparse中參數(shù)類型默認(rèn)為字符串(string)酵颁,可以通過type參數(shù)指定參數(shù)類型。

實例2. 添加一個可選參數(shù):-v/--verbose:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")

上述代碼生成的程序使用格式為:usage: argTest.py [-h] [-v VERBOSE],可選參數(shù)-v/--verbose后面必須加上一個值(任意類型)。因此具體使用應(yīng)類似:

$ python3 argTest.py -v 1
verbosity turned on
$ python3 argTest.py --verbose haha
verbosity turned on

通常程序的可選參數(shù)表現(xiàn)形式為布爾值類型:TrueFalse刑然。可以通過在方法add_argument中為參數(shù)加上參數(shù)action進(jìn)行指定武鲁。

實例3. 為程序添加一個位置參數(shù):square,類型為int蝠检;同時添加一個布爾類型的可選參數(shù):-v/--verbose:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
    print("the square of {} equals {}".format(args.square, answer))
else:
    print(answer)

上述代碼生成的程序使用格式為:usage: argTest.py [-h] [-v] square沐鼠,因此具體使用應(yīng)類似:

$ python3 argTest.py
usage: argTest.py [-h] [-v] square
argTest.py: error: the following arguments are required: square
$ python3 argTest.py 4
16
$ python3 argTest.py 4 --verbose
the square of 4 equals 16
$ python3 argTest.py --verbose 4
the square of 4 equals 16

action="store_true"表示當(dāng)顯示指定了可選參數(shù)時,其值為True叹谁,當(dāng)未指定時饲梭,則為False
action="store_false"與之相反焰檩,當(dāng)未指定參數(shù)時憔涉,其值為True,當(dāng)顯示指定參數(shù)時,其值為False

關(guān)鍵函數(shù)講解

從上面的示例中我們可以看到峦萎,argparse主要涉及到3個調(diào)用:

  • argparse.ArgumentParser()ArgumentParser 是一個類,該類對象內(nèi)部維護(hù)了對命令行參數(shù)解析為 Python 數(shù)據(jù)類型所必須的所有信息悴能。
    其構(gòu)造函數(shù)有如下參數(shù)可供使用:
Argument Description
prog 應(yīng)用名稱(默認(rèn):sys.argv[0]
usage 程序使用方法描述
description 顯示在參數(shù)列表幫助信息之前的文本展示(默認(rèn):無)
epilog 顯示在參數(shù)列表幫助信息之后的文本展示(默認(rèn):無)
parents 需要同時添加的一系列ArgumentParser對象
formatter_class 自定義幫助信息輸出的類
prefix_chars 可選參數(shù)前綴字符(默認(rèn):‘-‘)
fromfile_prefix_chars 參數(shù)文件集前綴字符(默認(rèn):無)
argument_default 全局參數(shù)默認(rèn)值(默認(rèn):無)
conflict_handler 可選參數(shù)沖突解決策略(通常不需要)
add_help 為解析器增加一個-h/--help選項(默認(rèn):True
allow_abbrev 允許長選項簡短表示夭拌,只要簡短表示不具備二義性(默認(rèn):True

:所有參數(shù)均為 關(guān)鍵字參數(shù),需以鍵值對形式進(jìn)行傳參即横。

  • ArgumentParser.add_argument:定義單個命令行參數(shù)解析規(guī)則。
    每個命令行參數(shù)擁有多個詳細(xì)描述,如下所示:
Argument Description
name or flags 一個名稱或則參數(shù)字符串列表。e.g. foo or -f, --foo
action 對該參數(shù)的處理動作
nargs 提取的命令行參數(shù)對應(yīng)的值的個數(shù)
const 如果命令行沒有傳入該參數(shù)驮宴,const指定該參數(shù)的默認(rèn)值,在某些action與nargs類型下才起作用
default 命令行中如果缺少該參數(shù)钻蔑,則使用該 default 指定的值
type 參數(shù)應(yīng)轉(zhuǎn)化成的類型
choices 參數(shù)允許的值
required 表明參數(shù)是否是必須的扬虚,只對可選參數(shù)有效
help 參數(shù)對應(yīng)的簡短描述
metavar 在使用信息中該參數(shù)對應(yīng)的名稱
dest parse_args()返回的對象對應(yīng)的屬性名稱

其中:
action 有如下幾個選項:

  • store:存儲參數(shù)值岭洲。該行為是默認(rèn)行為侥锦。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='1')
  • store_const:存儲關(guān)鍵字參數(shù) const 指定的值襟衰。該行為最常用于可選參數(shù)作為某些標(biāo)識使用玖详。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)
  • store_truestore_false:該類型為store_const用于存儲TrueFalse的特例三娩。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)
  • append:該選項存儲一個列表,并且把每個參數(shù)值添加到列表中。對于允許一個選項指定多次的場景很有用反璃。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
  • append_const:該選項存儲一個列表,并且把關(guān)鍵字參數(shù) const 指定的值存儲進(jìn)列表中俯画。該選項的典型使用場景是把多個具備常量值的參數(shù)存儲進(jìn)同一個列表中爬泥。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[<class 'str'>, <class 'int'>])
  • count:該選項統(tǒng)計某一關(guān)鍵字參數(shù)出現(xiàn)的次數(shù)辩越。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--verbose', '-v', action='count')
>>> parser.parse_args(['-vvv'])
Namespace(verbose=3)
  • version:該選擇需要在 add_argument() 方法中添加關(guān)鍵字參數(shù)version嘁扼,調(diào)用時會自動打印版本信息并自動退出。
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
>>> parser.parse_args(['--version'])
PROG 2.0
  • help:打印完整的參數(shù)幫助信息黔攒。

nargs 有如下幾個選項:

  • N(整型):指定參數(shù)后面數(shù)值個數(shù)趁啸,合并到一個列表中。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
  • ?:一個命令行參數(shù)值最多只接收一個值(單條目)亏钩。如果沒有對應(yīng)參數(shù)莲绰,則使用 default 指定的值。對于可選參數(shù)姑丑,有一個特例:如果只顯示了參數(shù),但沒有尾隨提供一個值辞友,則使用 const 指定的值栅哀。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='?', const='c', default='d')
>>> parser.add_argument('bar', nargs='?', default='d')
>>> parser.parse_args(['XX', '--foo', 'YY'])
Namespace(bar='XX', foo='YY')
>>> parser.parse_args(['XX', '--foo'])
Namespace(bar='XX', foo='c')
>>> parser.parse_args([])
Namespace(bar='d', foo='d')
  • *:所有顯示指定的參數(shù)會聚集到一個集合中。通常來說称龙,對多個位置參數(shù)使用nargs='*'并沒有多大意義留拾,但對于多個可選參數(shù)卻是可以的。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
  • +:與*一樣鲫尊,將所有顯示指定的參數(shù)聚集到一個列表中痴柔。另外,當(dāng)一個命令行參數(shù)都沒有指定時疫向,會拋出一個錯誤信息咳蔚。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', nargs='+')
>>> parser.parse_args(['a', 'b'])
Namespace(foo=['a', 'b'])
>>> parser.parse_args([])
usage: PROG [-h] foo [foo ...]
PROG: error: the following arguments are required: foo
  • argparse.REMAINDER:將剩余的命令行參數(shù)聚集到一個列表中。通常用于命令行工具分發(fā)給其他命令行工具搔驼。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo')
>>> parser.add_argument('command')
>>> parser.add_argument('args', nargs=argparse.REMAINDER)
>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')

如果nargs關(guān)鍵字參數(shù)未提供谈火,則讀取的參數(shù)個數(shù)由action決定。通常這意味著將讀取一個命令行參數(shù)并產(chǎn)生一個元素(不是一個列表)舌涨。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糯耍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子囊嘉,更是在濱河造成了極大的恐慌温技,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扭粱,死亡現(xiàn)場離奇詭異舵鳞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)焊刹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門系任,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恳蹲,“玉大人,你說我怎么就攤上這事俩滥〖卫伲” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵霜旧,是天一觀的道長错忱。 經(jīng)常有香客問我,道長挂据,這世上最難降的妖魔是什么以清? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮崎逃,結(jié)果婚禮上掷倔,老公的妹妹穿的比我還像新娘。我一直安慰自己个绍,他們只是感情好勒葱,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巴柿,像睡著了一般凛虽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上广恢,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天凯旋,我揣著相機(jī)與錄音,去河邊找鬼钉迷。 笑死至非,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篷牌。 我是一名探鬼主播睡蟋,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枷颊!你這毒婦竟也來了戳杀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤夭苗,失蹤者是張志新(化名)和其女友劉穎信卡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體题造,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡傍菇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了界赔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丢习。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牵触,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咐低,到底是詐尸還是另有隱情揽思,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布见擦,位于F島的核電站钉汗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鲤屡。R本人自食惡果不足惜损痰,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酒来。 院中可真熱鬧卢未,春花似錦、人聲如沸堰汉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衡奥。三九已至,卻和暖如春远荠,著一層夾襖步出監(jiān)牢的瞬間矮固,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工譬淳, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留档址,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓邻梆,卻偏偏與公主長得像守伸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浦妄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容