argparse(python)

介紹

argparse 模塊使編寫用戶友好的命令行界面變得容易峦睡。

該程序定義了它需要的參數(shù)翎苫,而 argparse 將弄清楚如何從 sys.argv 中解析出這些參數(shù)。 argparse 模塊還自動(dòng)生成幫助和使用消息榨了,并在用戶給程序無效參數(shù)時(shí)發(fā)出錯(cuò)誤煎谍。
官方參考:https://pypi.org/project/argparse/

安裝

pip install argparse

使用舉例

基本使用

import argparse

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

執(zhí)行結(jié)果

[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py --help
usage: test.py [-h]

optional arguments:
  -h, --help  show this help message and exit

設(shè)置默認(rèn)參數(shù)函數(shù)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo

執(zhí)行結(jié)果

[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py abcd
abcd

使用--help,發(fā)現(xiàn)echo是必填項(xiàng)

[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py --help   
usage: test.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit

定義可選參數(shù)

import argparse

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

--help:

[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py --help
usage: test.py [-h] [-v VERBOSITY]

optional arguments:
  -h, --help            show this help message and exit
  -v VERBOSITY, --verbosity VERBOSITY
                        increase output verbosity

執(zhí)行命令龙屉,這個(gè)參數(shù)可以沒有

[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py       
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ 

這個(gè)參數(shù)也可以有

[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py -v dasda
verbosity turned on : dasda

如果用省略方法 -v 賦值的方法呐粘,最終會(huì)到達(dá) --verbosity 值會(huì)傳遞到這個(gè)完整的參數(shù)中去。這里值得一提的是转捕,如果沒有后面的 --verbosity 只有 -v 的話作岖,那么值會(huì)可以通過 args.v 得到

也有可以不指定值的方法,可以讓此值直接默認(rèn)設(shè)置為 bool 值五芝,而使用 action='store_true' 可以做到

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", help="increase output verbosity", action="store_true")
args = parser.parse_args()
print args.verbosity
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py -v  
True

name or flags

add_argument() 方法必須知道它是否是一個(gè)選項(xiàng)痘儡,例如 -f 或 --foo,或是一個(gè)位置參數(shù)与柑,例如一組文件名谤辜。第一個(gè)傳遞給 add_argument() 的參數(shù)必須是一系列 flags 或者是一個(gè)簡單的參數(shù)名。例如价捧,可以選項(xiàng)可以被這樣創(chuàng)建:

parser.add_argument('-f', '--foo')

而位置參數(shù)可以這么創(chuàng)建:

parser.add_argument('bar')

當(dāng) parse_args() 被調(diào)用丑念,選項(xiàng)會(huì)以 - 前綴識(shí)別,剩下的參數(shù)則會(huì)被假定為位置參數(shù):

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar

action

ArgumentParser 對(duì)象將命令行參數(shù)與動(dòng)作相關(guān)聯(lián)结蟋。這些動(dòng)作可以做與它們相關(guān)聯(lián)的命令行參數(shù)的任何事脯倚,盡管大多數(shù)動(dòng)作只是簡單的向 parse_args() 返回的對(duì)象上添加屬性。action 命名參數(shù)指定了這個(gè)命令行參數(shù)應(yīng)當(dāng)如何處理嵌屎。供應(yīng)的動(dòng)作有:

'store' - 存儲(chǔ)參數(shù)的值推正。這是默認(rèn)的動(dòng)作

例如:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='1')

'store_const' - 存儲(chǔ)被 const 命名參數(shù)指定的值

'store_const' 動(dòng)作通常用在選項(xiàng)中來指定一些標(biāo)志。例如:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)

'store_true' and 'store_false'

這些是 'store_const' 分別用作存儲(chǔ) True 和 False 值的特殊用例宝惰。另外植榕,它們的默認(rèn)值分別為 False 和 True。例如:

>>> 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' - 存儲(chǔ)一個(gè)列表

將每個(gè)參數(shù)值追加到列表中尼夺。在允許多次使用選項(xiàng)時(shí)很有用尊残。例如:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])

'append_const'

存儲(chǔ)一個(gè)列表拐邪,并將 const 命名參數(shù)指定的值追加到列表中慰毅。(注意 const 命名參數(shù)默認(rèn)為 None婶芭。)'append_const' 動(dòng)作一般在多個(gè)參數(shù)需要在同一列表中存儲(chǔ)常數(shù)時(shí)會(huì)有用。例如:

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

nargs

ArgumentParser 對(duì)象通常關(guān)聯(lián)一個(gè)單獨(dú)的命令行參數(shù)到一個(gè)單獨(dú)的被執(zhí)行的動(dòng)作贵扰。 nargs 命名參數(shù)關(guān)聯(lián)不同數(shù)目的命令行參數(shù)到單一動(dòng)作纹坐。支持的值有:

N (一個(gè)整數(shù))

命令行中的 N 個(gè)參數(shù)會(huì)被聚集到一個(gè)列表中球切。 例如:

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

如果可能的話糙臼,會(huì)從命令行中消耗一個(gè)參數(shù)怠堪,并產(chǎn)生一個(gè)單一項(xiàng)璧针。如果當(dāng)前沒有命令行參數(shù)绘证,則會(huì)產(chǎn)生 default 值。注意,對(duì)于選項(xiàng),有另外的用例 - 選項(xiàng)字符串出現(xiàn)但沒有跟隨命令行參數(shù),則會(huì)產(chǎn)生 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')

nargs='?' 的一個(gè)更普遍用法是允許可選的輸入或輸出文件:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
...                     default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
...                     default=sys.stdout)
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>,
          outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>)
>>> parser.parse_args([])
Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>,
          outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)

*

所有當(dāng)前命令行參數(shù)被聚集到一個(gè)列表中名斟。注意通過 nargs='*' 來實(shí)現(xiàn)多個(gè)位置參數(shù)通常沒有意義,但是多個(gè)選項(xiàng)是可能的。例如:

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

type -- 類型

默認(rèn)情況下列疗,解析器會(huì)將命令行參數(shù)當(dāng)作簡單字符串讀入告材。 然而坤次,命令行字符串經(jīng)常應(yīng)當(dāng)被解讀為其他類型,例如 float 或 int。 add_argument() 的 type 關(guān)鍵字允許執(zhí)行任何必要的類型檢查和類型轉(zhuǎn)換疤剑。

如果 type 關(guān)鍵字使用了 default 關(guān)鍵字,則類型轉(zhuǎn)換器僅會(huì)在默認(rèn)值為字符串時(shí)被應(yīng)用误续。

傳給 type 的參數(shù)可以是任何接受單個(gè)字符串的可調(diào)用對(duì)象。 如果函數(shù)引發(fā)了 ArgumentTypeError, TypeError 或 ValueError腺办,異常會(huì)被捕獲并顯示經(jīng)過良好格式化的錯(cuò)誤消息焰手。 其他異常類型則不會(huì)被處理。

普通內(nèi)置類型和函數(shù)可被用作類型轉(zhuǎn)換器:

import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('source_file', type=open)
parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1'))
parser.add_argument('datapath', type=pathlib.Path)

choices

某些命令行參數(shù)應(yīng)當(dāng)從一組受限值中選擇躬拢。 這可通過將一個(gè)容器對(duì)象作為 choices 關(guān)鍵字參數(shù)傳給 add_argument() 來處理躲履。 當(dāng)執(zhí)行命令行解析時(shí),參數(shù)值將被檢查聊闯,如果參數(shù)不是可接受的值之一就將顯示錯(cuò)誤消息:

>>> parser = argparse.ArgumentParser(prog='game.py')
>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
>>> parser.parse_args(['rock'])
Namespace(move='rock')
>>> parser.parse_args(['fire'])
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')

請(qǐng)注意 choices 容器包含的內(nèi)容會(huì)在執(zhí)行任意 type 轉(zhuǎn)換之后被檢查工猜,因此 choices 容器中對(duì)象的類型應(yīng)當(dāng)與指定的 type 相匹配:

>>> parser = argparse.ArgumentParser(prog='doors.py')
>>> parser.add_argument('door', type=int, choices=range(1, 4))
>>> print(parser.parse_args(['3']))
Namespace(door=3)
>>> parser.parse_args(['4'])
usage: doors.py [-h] {1,2,3}
doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市菱蔬,隨后出現(xiàn)的幾起案子域慷,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犹褒,死亡現(xiàn)場離奇詭異,居然都是意外死亡弛针,警方通過查閱死者的電腦和手機(jī)叠骑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來削茁,“玉大人宙枷,你說我怎么就攤上這事〖氚希” “怎么了慰丛?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘾杭。 經(jīng)常有香客問我诅病,道長,這世上最難降的妖魔是什么粥烁? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任贤笆,我火速辦了婚禮,結(jié)果婚禮上讨阻,老公的妹妹穿的比我還像新娘芥永。我一直安慰自己,他們只是感情好钝吮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布埋涧。 她就那樣靜靜地躺著,像睡著了一般奇瘦。 火紅的嫁衣襯著肌膚如雪棘催。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天链患,我揣著相機(jī)與錄音巧鸭,去河邊找鬼。 笑死麻捻,一個(gè)胖子當(dāng)著我的面吹牛纲仍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贸毕,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼郑叠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了明棍?” 一聲冷哼從身側(cè)響起乡革,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后沸版,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘁傀,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年视粮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了细办。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕾殴,死狀恐怖笑撞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钓觉,我是刑警寧澤茴肥,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站荡灾,受9級(jí)特大地震影響瓤狐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卧晓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一芬首、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逼裆,春花似錦郁稍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桐愉,卻和暖如春财破,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背从诲。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工左痢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人系洛。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓俊性,卻偏偏與公主長得像,于是被迫代替她去往敵國和親描扯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子定页,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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